使用 get() 和 eval() 在 dplyr 函数中传递参数

use get() and eval() to pass argument in dplyr functions

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

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

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

您可以通过

让它工作
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

通常不使用 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')