功能参数;传递不带引号的变量名

时间:2018-12-04 14:26:06

标签: r dplyr

问题与此类似:

Pass a data.frame column name to a function

我有一个功能:

optimal_cutpoint <- function(data, ..., choice){
  selection <- dplyr::select(data, ...)
  choice <- data[[choice]]
  # do something with those two objects
}

该功能我将使用以下方式:

choicedata <- data.frame(PTV.A = c(0, 10, 5, 4, 7, 1, 2, 0, 0, 10),
                     PTV.B = c(5, 0, 1, 10, 6, 7, 10, 9, 5, 0),
                     PTV.C = c(10, 5, 10, 5, 2, 8, 0, 5, 5, 0),
                     VOTE = c("C", "A", "C", "B", "B", "C", "B","B", "B", "A"))
optimal_cutpoint(choicedata, PTV.A:PTV.C, choice = "VOTE")

现在是我的问题。使用...,我可以写不带引号的变量名。我可以不用引号写出“ VOTE”吗?我更愿意在函数中不加引号的方式编写它。

如果我使用dplyr :: select,它将搜索选项而不是投票。

dplyr::select(data,choice)

2 个答案:

答案 0 :(得分:5)

添加标记为##

的行
optimal_cutpoint <- function(data, ..., choice){
  selection <- dplyr::select(data, ...)
  choice <- deparse(substitute(choice)) ##
  choice <- data[[choice]]
  # do something with those two objects
}

out <- optimal_cutpoint(choicedata, PTV.A:PTV.C, choice = VOTE)
out
## [1] C A C B B C B B B A
## Levels: A B C

答案 1 :(得分:2)

这正是目的所在,有关更多信息,请参见here。奖励引用pull,基本上等于[[的dplyr。

optimal_cutpoint <- function(data, ..., choice){
  choice_quo = enquo(choice)
  selection <- dplyr::select(data, ...)
  choice <-dplyr::pull(data, !!choice_quo)
  # do something with those two objects
}

令我惊讶的是,...中的未引用参数使事情自动进行,我从未尝试过。

编辑,对quoenquo进行了一些额外的说明,因为我在原始答案中犯了这个错误。如果直接使用不带引号的值,请使用quo;如果要将不带引号的参数的值解释为函数,请使用enquo。比较

data(iris)
myvar = quo(Species)
select(iris, !!myvar)

myfun = function(d, myvar) {
  quovar = enquo(myvar)
  select(iris, !!quovar)
}
myfun(iris, Species)