2016-03-22 11 views
9

別の関数の内部で関数呼び出しを作成しなければならないことがよくあります。私は、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関数呼び出し、それをコンソールに入力して評価する方法です。

私はsubstitutelazyevalbquoteと代替的なアプローチを改ざんしているが、私はかなり彼らが仕事を得ることができないので、彼らが本当に何をすべきか理解しdont't。

通話を構築し、それを評価するより良い方法を見つけることができますか?

+0

は、他の人が問題の同じ種類[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のこのバイナリもあります。 –

答えて

9

アップデート4.29.17 - すぐにリリースされるdplyr 0.6.0では、これらの問題が解決されます。新しい回答が以下の質問に追加されました。 dplyrによるプログラミングの詳細については、see this vignetteを参照してください。


あなたは正しいアイデアがあります。あなたは?filter_ドット引数...でコードを少し短縮することができる場合があります

select_data <- function(x, ...) { 
    kall <- list(...) 
    filter_(.data=x, paste0(names(kall), "==", unlist(kall), collapse="&")) 
} 
select_data(DF, A = 2, C = 2) 
# A B C 
# 1 2 2 2 

dplyrと更新

プログラミングも中間コーダーのための非常に挑戦することができます。著者は、非標準的な評価の利点には、関数型プログラミングに関する難しさが伴うことを告白しています。

standard evaluation in dplyr

dplyr function does not work

Using dplyr functions within another function

Major dplyr functions in a function Pass arguments to dplyr functions

dplyr: filter where two columns in data.frame are equal

セント:同じ問題に実行しているSOユーザーの数があります。これらの問題を解決するためにepsが採用されています。 vignette to outline the basic fixesがあります。しかし私の謙虚な意見では、ビネットは機能プログラミングの説明が不足しています。例として書かれた関数は1つではありません。また、典型的に現れる混乱する例に対処するものでもありません。うまくいけば、NSEを修正するための呼び出しが増えれば、最終的には十分な応答を得ることができます。

非標準的な評価がプログラミングで引き起こす可能性のある混乱の最終的な例として、このユーザー用の解決策をしばらくは役に立たなかった。単に、プログラムsummariseを使用するように求めている:// stackoverflowの:ここで

Sub-function in grouping function using dplyr

関連する問題