別の関数の内部で関数呼び出しを作成しなければならないことがよくあります。私は、paste0()
を使ってテキストを構築して、eval(parse(text = "what_needs_to_be_done"))
を使う傾向があります。しかし、これは良いアプローチのように感じることはありません。次に例を示します。R:プログラムで関数呼び出しを作成する
select_data <- function(x, A = NULL, B = NULL, C = NULL) {
kall <- as.list(match.call())
vars <- names(kall)[names(kall) %in% c("A", "B", "C")]
selection_criteria <- paste0(vars, " == ", kall[vars], collapse = ", ")
txt <- paste0("dplyr::filter(x, ", selection_criteria, ")")
res <- eval(parse(text = txt))
return(res)
}
DF <- data.frame(A = c(1,1,2,2,3,3), B = c(1,2,1,2,1,2), C = c(1,1,1,2,2,2))
select_data(DF, A = 2, C = 2)
これは一例であり、ほとんどの場合、構築される関数はより複雑で広範囲です。しかし、この例は一般的な問題を示しています。私が今やっていることは、最初にpaste0
関数呼び出し、それをコンソールに入力して評価する方法です。
私はsubstitute
、lazyeval
、bquote
と代替的なアプローチを改ざんしているが、私はかなり彼らが仕事を得ることができないので、彼らが本当に何をすべきか理解しdont't。
通話を構築し、それを評価するより良い方法を見つけることができますか?
は、他の人が問題の同じ種類[Dplyrプログラミング](httpで苦労場所へのリンクです。データフレームの2つの列がどこにあるのか)と[非標準的評価](http://stackoverflow.com/questions/26492280/non-standard-company/questions/36139624/dplyr-評価 - nse-in-dplyrs-filter-pulling-data-from-mysql)を実行します。作者https://cran.r-project.org/web/packages/dplyr/vignettes/nse.htmlのこのバイナリもあります。 –