2017-01-13 28 views
2

私はdplyrでプログラミングしていますので、私は標準評価を使用しています。私は引数としてデータフレームと列名を持つ汎用関数を作成します。関数内で、私がデータフレームの列に自分自身を書き込んだ別の関数を適用したいと思います。ここでは、最小限の例です:今、一般的な機能を実行するときにdplyrでudfを使用した標準評価を使用

some_udf <- function(x) mean(x + 3) 
generic_function <- function(dat, input_var){ 
    dat %>% dplyr::summarise_(mean_3 = sprintf("some_udf(%s)", input_var)) 
} 

私は、次のエラーが発生します:

generic_function(mtcars, 'cyl') 

Error: could not find function "some_udf" 

some_udfがベースR機能に置​​き換えられた場合、meanまたはsdのように、すべての正常に動作します。

誰かが私にこのケースでudfがうまくいかない理由と解決方法を説明できますか?

答えて

3

これは基本的にはthis questionの複製です。これには受け入れられた回答はありませんが、David ArenburgとMrFlickのコメントで指摘されているように、式を式として渡す必要があります。利用可能:

library(dplyr) 

some_udf <- function(x) mean(x + 3) 
generic_function <- function(dat, input_var){ 
    dat %>% 
     summarise_(mean_3 = as.formula(sprintf("~some_udf(%s)", input_var))) 
} 

generic_function(mtcars, 'cyl') 
# mean_3 
# 1 9.1875 
+0

をそれを指摘するためのks。私はこの投稿を削除します。 – Edwin

+0

@エドウィンいいえ、あなたは実際にこの投稿を保持する必要があります。他の質問には答えがないので、重複として参照することはできません。 – nrussell

+1

いいえ、私はしません:) – Edwin

2

nse vignetteを読み、推奨interp方法を使用:よりも、それは確かに重複している

generic_function <- function(dat, input_var){ 
    dat %>% 
    dplyr::summarise_(mean_3 = lazyeval::interp(~some_udf(x), x = as.name(input_var))) 
} 

generic_function(mtcars, 'cyl') 
mean_3 
1 9.1875 
+1

ありがとう、私はしよう! – Edwin

関連する問題