1

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

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

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

4

2 回答 2

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
于 2017-07-31T15:19:47.477 回答
1

通常不使用get或不使用evaldplyr。请参阅 rlang 包中的小插图,了解该包是如何完成的;但是,在这种特殊情况下,可以直接传递varselect在它周围添加括号,这样它就不会将它与"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')
于 2017-07-31T15:32:46.127 回答