2016-08-31 4 views
1

私は、変数varsに適用される関数の文字列である引数funsをとる関数に取り組んでいます。これを行う最も簡単な方法は、dplyrのsummarize_atとのSEバージョンの機能を使用するように見えました。は、summarize_atのfuns引数として文字ベクトルを渡します

これは組み込みのRですが、ユーザー定義関数では機能しない関数で動作します。ユーザー定義関数が見つからないというエラーを報告します。ただし、summarize_atは「手動で」完了したときに機能します。

この関数は、シャイニーダッシュボード用のボックスを生成するより大きな関数の一部です。私は各タイプのボックス(各関数と関数の引数の組み合わせ)に異なるShinyモジュールを持たない(そして維持しなければならない)ことを望むだろう。

A最小限の再現性の例は以下の通りです:

print(compute_box_value(x, vars, ~equals(., test_value = 1))) 

います:から

# value 
#1  3 

# function to compute summary stat 
compute_box_value <- function(data, vars, funs) { 
    f = funs_(funs) 
    result <- data %>% 
    summarize_at(.cols = vars, .funs = f) 
} 

# simple user defined function that gets count of rows with certain values of x 
equals <- function(x, test_value) { 
    sum(x %in% test_value) 
} 

x <- data.frame(value = sample(1:5, 10, TRUE)) 

vars <- c("value") 

# this works 
print(compute_box_value(x, vars, "mean(., na.rm = TRUE)")) 

# this works 
summarize_at(x, vars, .funs = "equals", test_value = 1) 

# this doesn't work (error: couldn't find function equals) 
print(compute_box_value(x, vars, "equals(., test_value = 1)")) 

答えて

1

あなたは文字列の代わりに式(~)を使用する必要がありますdocumentation

それは式を評価する 発現と評価 がを発生する環境の両方をキャプチャするための式を使用するのが最善です。式がデータフレーム内の変数 とローカル環境内のオブジェクトの混合である場合、これは重要です。

+1

これは途中です。数式は動作しますが、文字列は使用できません。私は、 'eval(parse())'の中に文字列を入れ子にすることで、残りの部分が得られることを発見しました。答えとしてマークする。 – iacobus

+0

私は実際のコードでより大きな関数の中にネストされているので、文字列が必要であると付け加えるべきです。私は 'compute_box_value()'を直接呼び出すわけではないので、引数を文字列以外の引数として直接入力することはできません。 – iacobus

+0

@iacobus喜んで助けた!カバーされておらず、今後の読者に役立つ追加情報を自由に追加してください。これらの精度を質問に追加することもできます。 –

関連する問題