3

我对这个功能不起作用并不感到惊讶,但我不太明白为什么。

computeMeans <- function(data,dv,fun) {
    x <- with(data,aggregate(dv,
        list(
            method=method,
            hypo=hypothesis,
            pre.group=pre.group,
            pre.smooth=pre.smooth
        ),
        fun ) )
    return(x)
}

computeMeans(df.basic,dprime,mean)

df.basic具有因子method,hypothesis等和几个因变量的数据框在哪里(我用dv参数 dprime 指定了一个)。

我有多个因变量和几个相同形式的数据框,所以我想编写这个小函数来保持“简单”。我得到的错误是:

Error in aggregate(dv, list(method = method, hypo = hypothesis, 
pre.group = pre.group,  : 
    object 'dprime' not found

但是 dprime 确实存在于 df.basic 中,它以with(). 谁能解释这个问题?谢谢!

编辑:这是 R 编程语言。http://www.r-project.org/

4

3 回答 3

3

虽然dprime存在于 中df.basic,但当您调用它时,computeMeans它不知道您指的是什么,除非您明确引用它。

computeMeans(df.basic,df.basic$dprime,mean)

将工作。

于 2012-07-30T21:44:57.657 回答
3

或者

computeMeans <- function(data,dv,fun) {
    dv <- eval(substitute(dv), envir=data)
    x <- with(data,aggregate(dv,
        list(
            method=method,
            hypo=hypothesis,
            pre.group=pre.group,
            pre.smooth=pre.smooth
        ),
        fun ) )
    return(x)
}

您可能会认为,既然 dv 在with(data, (.))调用中,它会在data. 它不是。

当一个函数被调用时,参数是匹配的,然后每个形式参数都绑定到一个 Promise。为该形式参数给出的表达式和一个指向调用该函数的环境的指针都存储在 Promise 中。

在访问该参数之前,没有与该承诺关联的值。当参数被访问时,存储的表达式在存储的环境中被计算,并返回结果。结果也被 promise 保存了。

来源

因此,在创建它的环境(即调用函数的环境)中评估一个 Promise,而不管第一次调用 Promise 的环境如何。观察:

delayedAssign("x", y)
local({
    y <- 10
    x
})  
Error in eval(expr, envir, enclos) : object 'y' not found

w <- 10
delayedAssign("z", w)
local({
    w <- 11
    z
})
[1] 10

请注意,delayedAssign 创建了一个承诺。在第一个示例中,x 通过全局环境中的承诺分配了 y 的值,但 y 尚未在全局环境中定义。x 在已定义 y 的环境中调用,但调用 x 仍会导致错误,指示 y 不存在。这表明 x 在定义承诺的环境中进行评估,而不是在其当前环境中。

在第二个例子中,z 通过全局环境中的 promise 被赋予 w 的值,并且 w 是在全局环境中定义的。然后在 w 被分配了不同值的环境中调用 z,但 z 仍然返回创建 promise 的环境中 w 的值。

于 2012-07-30T21:59:07.660 回答
2

将参数作为字符串传递dprime将允许您回避@Michael 的回答中讨论的涉及范围界定和评估规则的任何考虑:

computeMeans <- function(data, dv, fun) {
    x <- aggregate(data[[dv]],
        list(
            method = data[["method"]],
            hypo = data[["hypothesis"]],
            pre.group = data[["pre.group"]],
            pre.smooth = data[["pre.smooth"]]
        ),
        fun )
    return(x)
}
computeMeans(df.basic, "dprime", mean)
于 2012-07-30T22:30:35.400 回答