2015-11-18 10 views
9

呼び出しの関数名が評価される範囲について質問しました(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)) 

のようなものが...そこに私を得るだろうが、これが動作するようには思えないことを期待しているだろう。何か案は?

+3

私は[バグ#1369](https://github.com/Rdatatable/data.table/issues/1369)は次のように、これは同じだと思う - まだ固定されていません。 – Arun

+2

明確に記述された問題、おもちゃのデータ、およびあなたが試したコードの良い最初の質問。ようこそ!そしてもちろん+1。 – Henrik

答えて

3

バグレポートに基づいて、私は今は "fun.aggregate"という名前のパラメータを使ってこの問題を回避することができました。

私にそれを指摘してくれてありがとう。

以下のコードは機能し、必要なものを実現します。平均値や局所的に定義された関数などの既存の関数名を渡すことができます。

testFunction <- function(DT1,functionName="mean") { 

    f2 <- function(x) { 
     y <- sum(x)^2 
     return(y) 
    } 

    fun.aggregate <- get(functionName) 

    r3 <- dcast.data.table(DT1,cat1~cat2,value.var="value",fun.aggregate=fun.aggregate) 
    return(r3) 
} 
result3 <- testFunction(DT,"mean") 
result4 <- testFunction(DT,"f2")