dplyr如何传递非字符串参数

时间:2015-03-31 21:13:04

标签: r function

很多时候在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)

1 个答案:

答案 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,因为它们可以发扬环境,并且我认为我同意。