呼び出しの関数名が評価される範囲について質問しました(data.table
バージョン1.9.6、R 3.2.2)。dcast.data.tableの動的/専用関数名
私は関数名を作りたいと思いますが、これは失敗します。これは正常に動作します
library(data.table)
DT <- data.table(value = c(1:10),
cat1 = c("a", "b", "a", "b", "a", "b", "a", "b", "c", "a"),
cat2 = c("x", "x", "x", "y", "y", "y", "y", "y", "y", "x"))
:ここ
f1 <- function(x) {
y <- sum(x)^2
return(y)
}
result2 <- dcast.data.table(DT, cat1 ~ cat2, value.var = "value", fun = f1)
私は:
result1 <- dcast.data.table(DT, cat1 ~ cat2, value.var = "value", fun = sum)
は今、私はまた、働く私自身の機能を、作る。ここ
は、私が試したものです同じことですが、関数内にプライベート関数を作成しています。ただし、これはError in eval(expr, envir, enclos) : could not find function "f2"
で失敗します。
f2をf1に置き換えると、f1を呼び出してf1を呼び出します。それは、表現fun = f2を評価するために地球環境を見ているようであり、f2はローカルスコープにのみ存在しているようです。
testFunction <- function(DT1) {
f2 <- function(x) {
y <- sum(x)^2
return(y)
}
r3 <- dcast.data.table(DT1,cat1 ~ cat2, value.var = "value", fun = f2)
return(r3)
}
result3 <- testFunction(DT)
回避策はありますか?私が本当にやりたかったのは、関数名f2を動的にすることで、 "f3"と言いましょう。私はprivate関数f3を呼び出します。
私は
functionName = "f3"
r3 <- dcast.data.table(DT1, cat1 ~ cat2, value.var = "value", fun = get(functionName))
のようなものが...そこに私を得るだろうが、これが動作するようには思えないことを期待しているだろう。何か案は?
私は[バグ#1369](https://github.com/Rdatatable/data.table/issues/1369)は次のように、これは同じだと思う - まだ固定されていません。 – Arun
明確に記述された問題、おもちゃのデータ、およびあなたが試したコードの良い最初の質問。ようこそ!そしてもちろん+1。 – Henrik