Используйте символьную строку в качестве аргумента функции - PullRequest
22 голосов
/ 20 октября 2011

Я уверен, что это просто, но я не могу найти решение ... Я хотел бы использовать переменную, содержащую символьную строку в качестве аргумента для функции.

x <- c(1:10)
myoptions <- "trim=0, na.rm=FALSE"

Теперь что-то вроде

foo <- mean(x, myoptions)

должно совпадать с

foo <- mean(x, trim=0, na.rm=FALSE)

Заранее спасибо!

Ответы [ 3 ]

25 голосов
/ 20 октября 2011

Вы можете использовать eval и parse:

foo <- eval(parse(text = paste("mean(x,", myoptions, ")")))
11 голосов
/ 20 октября 2011

Более естественный способ сделать то, что вы хотите, это использовать do.call.Например,

R> l[["trim"]] = 0
R> l[["na.rm"]] = FALSE
R> l[["x"]] = 1:10
##Or l <- list(trim = 0, na.rm = FALSE, x = 1:10)
R> do.call(mean, l)
 [1] 5.5

Если по какой-то причине вы действительно хотите использовать строку myoptions, вы всегда можете использовать strsplit для ее преобразования в форму списка.Например,

R> y = "trim=0, na.rm=FALSE"
R> strsplit(y, ", ")
[[1]]
[1] "trim=0"      "na.rm=FALSE" 
R> strsplit(y, ", ")[[1]][1]
[1] "trim=0"
2 голосов
/ 30 октября 2017

Вот третий ответ, который использует parse, alist и do.call.Моя мотивация для этого нового ответа, в случае, когда аргументы передаются в интерактивном режиме со стороны клиента в виде символов.Тогда я думаю, что нет хорошего способа не использовать parse.Предлагаемое решение с strsplit не может понять контекст, означает ли запятая , следующий аргумент или следующий аргумент в аргументе.strsplit не понимает контекст, поскольку strsplit не является синтаксическим анализатором.

здесь аргументы могут быть переданы как "a=c(2,4), b=3,5" или list("c(a=(2,4)","b=3","5")

#' convert and evaluate a list of char args to a list of arguments
#'
#' @param listOfCharArgs a list of chars 
#'
#' @return
#' @export
#'
#' @examples
#' myCharArgs = list('x=c(1:3,NA)',"trim=0","TRUE")
#' myArgs = callMeMaybe(myCharArgs)
#' do.call(mean,myArgs)
callMeMaybe2 = function(listOfCharArgs) {
  CharArgs = unlist(listOfCharArgs)
  if(is.null(CharArgs)) return(alist())
    .out = eval(parse(text = paste0("alist(",
      paste(parse(text=CharArgs),collapse = ","),")")))
}

myCharArgs = list('x=c(1:3,NA)',"trim=0","TRUE")
myArgs = callMeMaybe2(myCharArgs)
do.call(mean,myArgs)
 [1] 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...