我想查看一个函数的源代码,看看它是如何工作的.我知道我可以通过在提示符下键入其名称来打印函数:
> t
function (x)
UseMethod("t")
<bytecode: 0x2332948>
<environment: namespace:base>
Run Code Online (Sandbox Code Playgroud)
在这种情况下,是什么UseMethod("t")意思?我如何找到实际使用的源代码,例如:t(1:10)?
有没有当我看到之间的差异UseMethod,当我看到standardGeneric和showMethods,与with?
> with
standardGeneric for "with" defined from package "base"
function (data, expr, ...)
standardGeneric("with")
<bytecode: 0x102fb3fc0>
<environment: 0x102fab988>
Methods may be defined for arguments: data
Use showMethods("with") for currently available ones.
Run Code Online (Sandbox Code Playgroud)
在其他情况下,我可以看到正在调用R函数,但我找不到这些函数的源代码.
> ts.union
function (..., dframe = FALSE)
.cbind.ts(list(...), .makeNamesTs(...), dframe = dframe, union = TRUE)
<bytecode: 0x36fbf88>
<environment: namespace:stats>
> .cbindts
Error: object '.cbindts' …Run Code Online (Sandbox Code Playgroud) 如何在R中查看源代码?例如,对于功能portfolio.optim
> require(tseries)
> portfolio.optim
function (x, ...)
UseMethod("portfolio.optim")
<environment: namespace:tseries>
> methods(portfolio.optim)
[1] portfolio.optim.default* portfolio.optim.ts*
Non-visible functions are asterisked
> portfolio.optim.ts
Error: object 'portfolio.optim.ts' not found
> portfolio.optim.default
Error: object 'portfolio.optim.default' not found
Run Code Online (Sandbox Code Playgroud)
当我在本地安装R包时,它是否也下载了源代码?它存放在计算机上的哪个位置?有人知道吗?
我写了一个脚本,如果提供的数据不正确,应停止执行.但是,虽然stop会生成错误消息,但脚本仍会继续.一个最小的例子:
if (TRUE) {stop("End of script?")} #It should stop here
print("Script did NOT end!") # but it doesn't, because this line is printed!
Run Code Online (Sandbox Code Playgroud)
控制台输出:
> if (TRUE) {stop("End of script?")}
Error: End of script?
> print("Script did NOT end!")
[1] "Script did NOT end!"
>
Run Code Online (Sandbox Code Playgroud)
这实际上并不奇怪,因为来自?stop:
停止执行当前表达式并执行错误操作.
所以它只结束当前表达式,而不是脚本.我在这里发现你可以将{}包裹在整个脚本周围(或者将它放在一个函数中),但这似乎是一种解决方法而不是解决方案.当然,捕获错误并自行处理它们是很好的编程习惯(例如参见mra68中的注释中的链接),但我仍然想知道是否可以在R中停止脚本.
我也尝试过return和break,但这只有在一个函数或循环工作.我搜索了其他可能的关键字,如"停止"和"结束",但没有运气.我感觉有点愚蠢,因为这似乎是一个非常基本的问题.
那么,是否有一个命令可以使我的脚本停止/停止/结束致命错误?
我在Windows 8上运行R 3.2.3,但在MAC-OSX上与R 3.0.1有同样的问题.
> sessionInfo()
R version 3.2.3 (2015-12-10)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows >= 8 …Run Code Online (Sandbox Code Playgroud) 我想查看R match.call函数的源代码.由于它是一个内部函数,我下载了R源代码,转到./src/main/names.c并寻找match.call那里.
因此,我发现调用了相应的.c函数do_matchcall.好的,但是如何找出./src/main/中的几十个.c文件中包含哪些功能do_matchcall?
顺便说一句,我正在使用Windows机器,以防万一.
当我尝试"解码"原始或内部R函数时,Ben Bolkers对这个问题的回答和Uwe Ligges的文章已经非常有用.但原始R函数如何与其相应的C函数相连?我想不知何故.Primitive必须提供这个缺失的链接.举个例子is.na:
> is.na
function (x) .Primitive("is.na")
Run Code Online (Sandbox Code Playgroud)
FUNTAB R_FunTab[] 在文件"names.c"中包含
{"is.na", do_isna, 0, 1, 1, {PP_FUNCALL, PREC_FN, 0}},
Run Code Online (Sandbox Code Playgroud)
这意味着is.na使用C函数do_isna.
do_isna在文件"coerce.c"中定义:
SEXP attribute_hidden do_isna(SEXP call, SEXP op, SEXP args, SEXP rho)
{
SEXP ans, dims, names, x;
R_xlen_t i, n;
checkArity(op, args);
check1arg(args, call, "x");
if (DispatchOrEval(call, op, "is.na", args, rho, &ans, 1, 1))
return(ans);
PROTECT(args = ans);
#ifdef stringent_is
if (!isList(CAR(args)) && !isVector(CAR(args)))
errorcall_return(call, …Run Code Online (Sandbox Code Playgroud) 我想了解为什么R中的sum / min / max函数提供给na.rm时会将字符串解释为TRUE,而mean()没有。
我没有根据的猜测是as.logical("xyz")返回NA,它作为参数提供给na.rm,出于某种奇怪的原因,sum / min / max被接受为TRUE,而不是mean()
参数的预期输出sum(c(NA, 4, 5), na.rm = "xyz")不能解释为逻辑错误(从均值返回)。我不明白为什么不是这种情况。
我已阅读说明,但我仍然对.Internal功能的作用感到困惑.因为它可以正常工作.Internal(body(mean))但不能正常工作.Internal(mean).我认为这是用c ++编写的并且是编译的,但是可以看到代码吗?在R文件夹的哪个文件夹中?
提前致谢
所述acfR中的统计库函数包括线
.Call(C_acf, x, lag.max, type == "correlation")
Run Code Online (Sandbox Code Playgroud)
但我C_acf在我的机器上的任何地方都找不到该文件(也不在https://github.com/SurajGupta/r-source或https://github.com/wch/r-source)。
在这些问题上应用建议并没有帮助:
如何查看 R .Internal 或 .Primitive 函数的源代码?
该文件似乎不在人们说要查看的任何地方。我怎样才能找到 C_acf?
我正在寻找用于计算R rank函数的C源
我查看了R/src/main/目录,我找不到它.当我使用R的内部秩功能时,有谁知道我在哪里可以找到R调用的源代码?例如当一个人做的时候叫什么.Internal(rank(x,"average")).
或者,我想确保获得对应于浮点向量的秩向量的有效方法是首先对它们进行排序.
我在R中发现了这个怪癖,并且无法找到它出现的原因.我试图重新创建一个样本作为检查,并发现该sample函数在某些情况下表现不同.看这个例子:
# Look at the first ten rows of a randomly ordered vector of the first 10 million integers
set.seed(4)
head(sample(1:10000000), 10)
[1] 5858004 89458 2937396 2773749 8135739 2604277 7244055 9060916 9490395 731445
# Select a specified sample of size 10 from this same list
set.seed(4)
sample(1:10000000), size = 10)
[1] 5858004 89458 2937396 2773749 8135739 2604277 7244055 9060916 9490395 731445
# Try the same for sample size 10,000,001
set.seed(4)
head(sample(1:10000001), 10)
[1] 5858004 89458 2937396 2773750 8135740 …Run Code Online (Sandbox Code Playgroud) 我想知道获取 R 中任何辅助函数(以区别于原始/内部函数)的 C/C++ 源代码的正确方法是什么。\n相关问题在这里、这里、这里和这里:
\n\n我的不同,所以我在问题中使用了“次要”。\n例如,R控制台中的read.table()函数我得到:
\n\n>?read.table\n\nread.table package:utils R Documentation\n\nData Input\n\nDescription:\n\n Reads a file in table format and creates a data frame from it,\n with cases corresponding to lines and variables to fields in the\n file.\n\nUsage:\n read.table(file, header = FALSE, sep = "", quote = "\\"\'",\n ......\nRun Code Online (Sandbox Code Playgroud)\n\n或者
\n\n> getAnywhere(read.table)\nA single object matching \xe2\x80\x98read.table\xe2\x80\x99 was found\nIt was found in the following places\n package:utils\n …Run Code Online (Sandbox Code Playgroud)