6

データフレームと関数の名前を引数として取る関数を作成しようとしています。標準の R 構文で関数を記述しようとすると、 http: //adv-r.had.co.nz/Computing-on-the-language.html で @hadley が推奨するように、evalandを使用して良い結果を得ることができます。substitute

> df <- data.frame(y = 1:10)
> f <- function(data, x) {
+   out <- mean(eval(expr = substitute(x), envir = data))
+   return(out)
+ }
> f(data = df, x = y)
[1] 5.5

ここで、演算子を使用して同じ関数を記述しようとすると、機能し%>%ません:

> df <- data.frame(y = 1:10)
> f <- function(data, x) {
+   data %>% 
+     eval(expr = substitute(x), envir = .) %>% 
+     mean()
+ }
> f(data = df, x = y)
Show Traceback
Rerun with Debug
 Error in eval(expr, envir, enclos) : objet 'y' introuvable 
> 

evalパイプ演算子とandを組み合わせて使用​​するにはどうすればよいsubstituteですか? 私には本当に難しいようです。

4

3 に答える 3

3

私は自分の問題を理解しようとしてきました。

まず、関数で必要なものを書きましたsummarise()

> library(dplyr)
> df <- data.frame(y = 1:10)
> summarise_(.data = df, mean = ~mean(y))
  mean
1  5.5

次に、独自の関数をプログラムしようとします。この投稿lazyevalのパッケージで動作すると思われる解決策を見つけました。と関数を使用して、必要なものを記述します。lazy()interp()

最初の可能性はここにあります:

> library(lazyeval)
> f <- function(data, col) {
+   col <- lazy(col)
+   inter <- interp(~mean(x), x = col)
+   summarise_(.data = data, mean = inter)    
+   }
> f(data = df, col = y)
  mean
1  5.5

パイプも使用できます:

> f <- function(data, col) {
+   col <- lazy(col)
+   inter <- interp(~mean(x), x = col)
+   data %>% 
+     summarise_(.data = ., mean = inter)    
+ }
> 
> f(data = df, col = y)
  mean
1  5.5
于 2016-02-18T16:10:19.013 に答える