パッケージには、引数data.table
として式を使用する必要がある特別な構文があります。i
j
これは、FAQのセクション1.16で非常によく説明されているように、引数を受け入れてデータテーブルに渡す関数を作成する方法にいくつかの影響を及ぼします。
しかし、私はこれをさらに1つのレベルにする方法を理解できません。
これが例です。foo()
データの特定の要約を作成するラッパー関数を作成し、次に結果plotfoo()
を呼び出しfoo()
てプロットする2番目のラッパーを作成するとします。
library(data.table)
foo <- function(data, by){
by <- substitute(by)
data[, .N, by=list(eval(by))]
}
DT <- data.table(mtcars)
foo(DT, gear)
表形式の結果が得られるので、これでうまくいきます。
by N
1: 4 12
2: 3 15
3: 5 5
今、私は書くときに同じことをしようとしますplotfoo()
が、私は惨めに失敗します:
plotfoo <- function(data, by){
by <- substitute(by)
foo(data, eval(by))
}
plotfoo(DT, gear)
しかし、今回はエラーメッセージが表示されます。
Error: evaluation nested too deeply: infinite recursion / options(expressions=)?
OK、それでeval()
問題を引き起こしています。それを削除しましょう:
plotfoo <- function(data, by){
by <- substitute(by)
foo(data, by)
}
plotfoo(DT, gear)
いいえ、新しいエラーメッセージが表示されます。
Error in `[.data.table`(data, , .N, by = list(eval(by))) :
column or expression 1 of 'by' or 'keyby' is type symbol. Do not quote column names. Useage: DT[,sum(colC),by=list(colA,month(colB))]
そして、ここが私が立ち往生しているところです。
質問:data.tableを呼び出す関数を呼び出す関数を作成するにはどうすればよいですか?