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

EGM*_*686 2 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)
Run Code Online (Sandbox Code Playgroud)

我创建了一个这样的函数:

sel <- function(df, variable) {
    var <- enquo(variable)
    df2 <- select(df, starts_with(!!var))
    return(df2)
}
Run Code Online (Sandbox Code Playgroud)

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

sel(data, instrument)
Run Code Online (Sandbox Code Playgroud)

无需引用参数“instrument”。我需要它不被引用,因为这是一个更大的函数的一部分。如果我像上面那样运行它,我会得到:

Error in is_string(match) : object 'instrument' not found 
Run Code Online (Sandbox Code Playgroud)

tim*_*tim 5

你正在寻找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)
Run Code Online (Sandbox Code Playgroud)

返回:

  instrument1 instrument2
1      guitar      guitar
2        bass        bass
3      guitar      guitar
4       drums       drums
5        bass        bass
6       drums       drums
Run Code Online (Sandbox Code Playgroud)