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.basicfactor 、 など、およびいくつかの従属変数を含むデータフレームはどこにありmethodますhypothesisか (そして、パラメーター dprime で 1 つを指定します) dv

複数の従属変数といくつかのデータフレームがすべて同じ形式であるため、この小さな関数を記述して物事を「シンプル」に保ちたいと考えました。私が得るエラーは次のとおりです。

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

あるいは

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)
}

with(data, (.))dv は呼び出しの中にあるので、 の環境内で評価されると思うかもしれませんdata。そうではありません。

関数が呼び出されると、引数が照合され、各仮引数が promise にバインドされます。その仮引数に与えられた式と、関数が呼び出された環境へのポインターが 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 は promise を作成することに注意してください。最初の例では、グローバル環境でプロミスを介して x に y の値が割り当てられますが、グローバル環境では y が定義されていません。y が定義されている環境で x が呼び出されますが、x を呼び出すと、y が存在しないことを示すエラーが発生します。これは、現在の環境ではなく、promise が定義された環境で x が評価されることを示しています。

2 番目の例では、グローバル環境で promise を介して z に w の値が割り当てられ、w がグローバル環境で定義されます。次に、w に別の値が割り当てられている環境で z が呼び出されますが、z は promise が作成された環境で w の値を返します。

于 2012-07-30T21:59:07.660 に答える
3

dprimeに存在しますがdf.basic、で呼び出すと、computeMeans明示的に参照しない限り、何を参照しているのかわかりません。

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

動作します。

于 2012-07-30T21:44:57.657 に答える
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 に答える