パッケージdata.table
には、式をi
とj
引数として使用するための特別な構文があります。data.tableを呼び出す関数を呼び出す関数の記述方法?
これは、実際にはsection 1.16 of the FAQsで説明されているように、データテーブルに引数を受け入れて渡す書き込み関数がどのように機能するかにいくつかの意味があります。
しかし、私はこの1つの追加レベルを取る方法を理解できません。
ここは例です。私は私の集計結果を得るために、この作品、
library(data.table)
foo <- function(data, by){
by <- substitute(by)
data[, .N, by=list(eval(by))]
}
DT <- data.table(mtcars)
foo(DT, gear)
OK:私は私のデータの特定のサマリーを作るラッパー関数foo()
を書き、その後foo()
を呼び出し、結果をプロット秒ラッパーplotfoo()
したいと言います:
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)
は、しかし、私はエラーメッセージが表示されます。この時間は:
OK
Error: evaluation nested too deeply: infinite recursion/options(expressions=)?
、そう
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を呼び出す関数を呼び出す関数を作成するにはどうすればよいですか?
ないソリューションが、あなたは、 '代替を(削除した場合by)と 'eval'を呼び出し、' foo(DT、 "gear") 'のような文字変数として' gear'を渡します。 – Arun