在主函数外部使用.Call

时间:2014-08-05 17:55:45

标签: r

我试图分析cor(stats)函数,但我在第一行.Call函数上堆栈:

.Call(C_cor, x, y, na.method, FALSE)

C_cor在被调用之前尚未定义,它在任何地方都没有定义,如何在cor函数之外的行之上执行?将y设置为NULL,将na.method设置为所有内容,将x设置为某个数据集,将相同的对象设置为C_cor'未找到错误,下面是cor()主体的一部分:

> cor
    function (x, y = NULL, use = "everything", method = c("pearson", 
        "kendall", "spearman")) 
{
    na.method <- pmatch(use, c("all.obs", "complete.obs", "pairwise.complete.obs", 
        "everything", "na.or.complete"))
    if (is.na(na.method)) 
        stop("invalid 'use' argument")
    method <- match.arg(method)
    if (is.data.frame(y)) 
        y <- as.matrix(y)
    if (is.data.frame(x)) 
        x <- as.matrix(x)
    if (!is.matrix(x) && is.null(y)) 
        stop("supply both 'x' and 'y' or a matrix-like 'x'")
    if (!(is.numeric(x) || is.logical(x))) 
        stop("'x' must be numeric")
    stopifnot(is.atomic(x))
    if (!is.null(y)) {
        if (!(is.numeric(y) || is.logical(y))) 
            stop("'y' must be numeric")
        stopifnot(is.atomic(y))
    }
    Rank <- function(u) {
        if (length(u) == 0L) 
            u
        else if (is.matrix(u)) {
            if (nrow(u) > 1L) 
                apply(u, 2L, rank, na.last = "keep")
            else row(u)
        }
        else rank(u, na.last = "keep")
    }
    if (method == "pearson") 
        Call(C_cor, x, y, na.method, FALSE)
   ...

使用示例

你可以像下面这样打电话给C_cor:

C_cor=get("C_cor", asNamespace("stats"))  
.Call(C_cor, x=as.matrix(iris[,1:4]), y=NULL, method=1, FALSE

其中method是此列表中方法的编号:

c("all.obs", "complete.obs", "pairwise.complete.obs",   
            "everything", "na.or.complete")

1 个答案:

答案 0 :(得分:2)

C_corstats包中的一个变量,不会导出以供一般使用。您可以使用

查看其内容
 get("C_cor", asNamespace("stats"))

但由于environment(cor)<environment: namespace:stats>cor()函数可以访问那些未导出的变量。

.Call函数用于从已编译的DLL或共享对象运行代码。如果您想跟踪源代码,也许请阅读this question。通常,您不应该尝试直接调用这些函数,因为如果传入错误/意外的参数,可能会导致崩溃。