私は、変数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)"))
これは途中です。数式は動作しますが、文字列は使用できません。私は、 'eval(parse())'の中に文字列を入れ子にすることで、残りの部分が得られることを発見しました。答えとしてマークする。 – iacobus
私は実際のコードでより大きな関数の中にネストされているので、文字列が必要であると付け加えるべきです。私は 'compute_box_value()'を直接呼び出すわけではないので、引数を文字列以外の引数として直接入力することはできません。 – iacobus
@iacobus喜んで助けた!カバーされておらず、今後の読者に役立つ追加情報を自由に追加してください。これらの精度を質問に追加することもできます。 –