很多时候在dplyr中,我们会做类似的事情:
mydat %>% select(., mycol1, mycol2, mycol3)
但是,mycol1,mycol2和mycol3不是字符串,而只是R中的文本。如何将函数转换为字符串。
例如,如果我这样做:
dat <- data.frame(blue = rnorm(100), red= rnorm(100))
mysum <- function(dat, x, y){
browser()
return (sum(dat$x)+ sum(dat$y))
}
mysum(dat, blue, red)
答案 0 :(得分:3)
您的函数始终会传递0
,因为$
中缀函数使用其右侧参数的非标准评估。 (正如你所指出的,非标准评估是@ hadley函数中最受欢迎的机制。对我来说这是一个障碍,但对于很多人来说,这似乎是一种受欢迎的策略。)如果你以这种方式编写函数(使用{{ 1}})你通常无法得到你想要的东西:
$
你之前说过:“但是,mycol1,mycol2和mycol3不是字符串,只是R中的文字。”我猜你试图说 mysum(dat, blue, red)
[1] 0 # Wrong answer
没有用引号括起来,所以不是字符文字。在R中,这样的“文本”(一系列不带引号的字符)被称为“符号”或“名称”。 (到目前为止,我们并没有讨论与dplyr有关的任何事情。)如果你想编写一个能够提供这个总和的函数,你会这样做(避免mycol
操作):
$
如果要检索匹配参数的参数名称,则需要使用mysum <- function(dat, x, y){
return (sum(dat[[x]])+ sum(dat[[y]]))
}
mysum(dat, 'blue', 'red')
[1] 19.16727
- 机动:
deparse( substitute(.))
如果你想看看@hadley是怎么做的,那么只需输入:
dat <- data.frame(blue = rnorm(10), red= rnorm(10))
mysum2 <- function(dfrm, arg1, arg2){
a1 <- deparse(substitute(arg1)); a2 <- deparse(substitute(arg2))
sum(dfrm[[a1]]) +sum(dfrm[[a2]]) }
mysum2(dat, blue, red)
#[1] -0.5754979
mysum(dat, "blue", "red")
#[1] -0.5754979
....并没有真正提供答案,是吗?所以我们需要尝试这个:
> dplyr::select
function (.data, ...)
{
select_(.data, .dots = lazyeval::lazy_dots(...))
}
<environment: namespace:dplyr>
...有一个名为“lazyeval :: lazyeval”的附带小插图 - &gt; “Lazyeval:NSE的新方法”。哈德利辩称,他的 help(pac=lazyeval)
功能优于传统的lazyeval
,因为它们可以发扬环境,并且我认为我同意。