我正在尝试编写我的函数并且需要在里面传递参数。以 mtcars 数据集为例:
get.param <- function(data, var){
data %>% select(eval(var)) %>%
head()
}
get.param(mtcars, 'hp')
在上面的函数中,用 get() 替换 eval() 给了我错误。我有点困惑我应该使用哪一个。我使用 get() i 其他一些功能和工作。这两者有什么区别?
你可以让它通过
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
通常不使用get
或不使用eval
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')