将不带引号的参数作为字符传递给选择函数

时间:2019-09-12 05:00:43

标签: r dplyr

我有一个数据框:

data <- data.frame(
    name = c("John", "Paul", "George", "Ringo", "Stuart", "Pete"),
    instrument1 = c("guitar", "bass", "guitar", "drums", "bass","drums"),
    instrument2 = c("guitar", "bass", "guitar", "drums", "bass","drums"),stringsAsFactors=FALSE)

然后我创建一个像这样的函数:

sel <- function(df, variable) {
    var <- enquo(variable)
    df2 <- select(df, starts_with(!!var))
    return(df2)
}

如何使用以下命令运行此功能:

sel(data, instrument)

无需引用参数“仪器”。我需要不加报价,因为这是更大功能的一部分。如果我像上面那样烂了,我得到:

Error in is_string(match) : object 'instrument' not found 

2 个答案:

答案 0 :(得分:2)

您正在寻找deparse(substitute(x))的魔力!它将返回您以字符串形式传递的参数名称。

data <- data.frame(
  name = c("John", "Paul", "George", "Ringo", "Stuart", "Pete"),
  instrument1 = c("guitar", "bass", "guitar", "drums", "bass","drums"),
  instrument2 = c("guitar", "bass", "guitar", "drums", "bass","drums"),stringsAsFactors=FALSE)

sel <- function(df, variable) {
  var <- deparse(substitute(variable))
  df2 <- select(df, starts_with(!!var))
  return(df2)
}

sel(data, instrument)

哪个返回:

  instrument1 instrument2
1      guitar      guitar
2        bass        bass
3      guitar      guitar
4       drums       drums
5        bass        bass
6       drums       drums

答案 1 :(得分:1)

我们可以使用rlang::enexprvariable转换为名称类,然后使用as.character将其更改为字符,并将其作为参数传递给starts_with

sel <- function(df, variable) {
  var <- as.character(rlang::enexpr(variable))
  df2 <- dplyr::select(df, starts_with(var))
  return(df2)
}

sel(data, instrument)

#  instrument1 instrument2
#1      guitar      guitar
#2        bass        bass
#3      guitar      guitar
#4       drums       drums
#5        bass        bass
#6       drums       drums