Функциональный параметр;передача имени переменной без кавычек - PullRequest
0 голосов
/ 04 декабря 2018

Вопрос похож на этот:

Передать имя столбца data.frame в функцию

У меня есть функция:

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")

Теперь к моему вопросу.С помощью ... я могу написать имена переменных без кавычек.Есть ли вероятность, что я смогу написать «ГОЛОСОВАНИЕ» без кавычек?Я бы предпочел написать его без кавычек, чтобы он был непротиворечивым в функции.

Если я использую dplyr :: select, он ищет выбор вместо голосования.

dplyr::select(data,choice)

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Это именно то, для чего нужны кавычки, см. здесь для получения дополнительной информации.Бонусная ссылка на 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
}

Я удивлен, что все работает автоматически с аргументами без кавычек в ..., я никогда не пробовал это раньше.

РЕДАКТИРОВАТЬ некоторые дополнительные разъяснения по quo и enquo, поскольку я допустил эту ошибку в своем первоначальном ответе.Используйте quo, если вы используете значение без кавычек напрямую, и enquo, если интерпретируете значение аргумента без кавычек для функции.Сравните

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

с

myfun = function(d, myvar) {
  quovar = enquo(myvar)
  select(iris, !!quovar)
}
myfun(iris, Species)
0 голосов
/ 04 декабря 2018

Добавьте строку с пометкой ##

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...