【问题标题】:use get() and eval() to pass argument in dplyr functions使用 get() 和 eval() 在 dplyr 函数中传递参数
【发布时间】:2017-07-31 15:17:09
【问题描述】:

我正在尝试编写我的函数并且需要在里面传递参数。 以 mtcars 数据集为例:

get.param <- function(data, var){
    data %>% select(eval(var)) %>% 
             head()
}
get.param(mtcars, 'hp')

在上面的函数中,用 get() 替换 eval() 给了我错误。 我有点困惑我应该使用哪一个。我使用 get() i 其他一些功能和工作。这两者有什么区别?

【问题讨论】:

  • What (choose >=1) 是您对 get.param 的第二个参数打算是:文字字符串(如您的示例中所示);评估为字符串的东西(例如具有字符串值的变量);要在第一个参数的上下文中评估的名称?
  • @zesla,请考虑从有帮助的答案中选择一个答案(单击复选标记)。这让社区知道答案有效

标签: r dplyr rlang


【解决方案1】:

你可以通过它来工作

get.param <- function(data, var){
    var <- enquo(var)
    data %>% select(!!var) %>% 
             head()
}
get.param(mtcars, hp)

                   hp
Mazda RX4         110
Mazda RX4 Wag     110
Datsun 710         93
Hornet 4 Drive    110
Hornet Sportabout 175
Valiant           105

【讨论】:

    【解决方案2】:

    通常不会将geteval 与dplyr 一起使用。请参阅 rlang 包中的小插图,了解该包是如何完成的;但是,在这种特殊情况下,可以将var 直接传递给select,并在其周围添加括号,这样它就不会与名为"var" 的列(如果存在)混淆。如果您不担心这种极端情况,可以省略括号。

    get.param <- function(data, var) {
        data %>% select((var)) %>% head
    }
    
    get.param(mtcars, 'hp')
    

    给予:

                       hp
    Mazda RX4         110
    Mazda RX4 Wag     110
    Datsun 710         93
    Hornet 4 Drive    110
    Hornet Sportabout 175
    Valiant           105
    

    另一种可能性是像这样使用... 并给出相同的答案。在这个变体中,我们不需要添加括号来消除边缘情况。它还允许指定多个列。

    get.param <- function(data, ...) {
        data %>% select(...) %>% head
    }
    
    get.param(mtcars, 'hp')
    

    【讨论】:

    • 好点。已将其更改为 (var) 以避免出现这种极端情况。
    • 我仍然认为 get.param = function(data, var){head(data[,var,drop=FALSE])} 不那么滑(而且速度快 50 倍),但是嘿管道和 dplyr 所有的东西。
    • 但问题是如何使用dplyr。
    • 如果有人问如何用螺丝刀敲钉子,你会不会建议他们改用锤子?
    猜你喜欢
    • 2019-10-26
    • 2018-01-08
    • 2019-11-28
    • 1970-01-01
    • 2015-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多