[英]How can I use dplyr and magrittr to pipe a data manipulation into a function that requires a numeric vector?
[英]How can I use dplyr/magrittr's pipe inside functions in R?
我正在嘗試編寫一個函數,它將數據幀和函數的名稱作為參數。 當我嘗試使用標准R語法編寫函數時,我可以使用eval
獲得良好的結果,並在http://adv-r.had.co.nz/Computing-on-the-language中按@hadley的推薦substitute
html的
> 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
和substitute
的組合使用? 這對我來說似乎很棘手。
解決方法是
f <- function(data, x) {
v <- substitute(x)
data %>%
eval(expr = v, envir = .) %>%
mean()
}
問題是管道函數( %>%
)正在創建另一個級別的閉包,這會干擾substitute(x)
的評估。 你可以看到這個例子的不同之處
df <- data.frame(y = 1:10)
f1 <- function(data, x) {
print(environment())
eval(expr = environment(), envir = data)
}
f2 <- function(data, x) {
print(environment())
data %>%
eval(expr = environment(), envir = .)
}
f1(data = df, x = y)
# <environment: 0x0000000006388638>
# <environment: 0x0000000006388638>
f2(data = df, x = y)
# <environment: 0x000000000638a4a8>
# <environment: 0x0000000005f91ae0>
請注意matrittr版本中的環境有何不同。 在非標准評估時,你想盡快照顧substitute
品。
我希望你的用例比你的例子更復雜,因為它看起來像
mean(df$y)
將是一個更容易閱讀的代碼。
我一直在努力理解我的問題。
首先,我用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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.