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

时间:2017-07-31 15:17:10

标签: r dplyr rlang

我正在尝试编写我的函数,需要在内部传递参数。 使用mtcars数据集作为示例:

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

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

通常情况下,不会将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')