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