Ответ 1
Вы можете использовать eval
и parse
:
foo <- eval(parse(text = paste("mean(x,", myoptions, ")")))
Я уверен, что это просто, но я не могу найти решение... Я хотел бы использовать переменную, содержащую символьную строку в качестве аргумента для функции.
x <- c(1:10)
myoptions <- "trim=0, na.rm=FALSE"
Теперь что-то вроде
foo <- mean(x, myoptions)
должен быть таким же, как
foo <- mean(x, trim=0, na.rm=FALSE)
Спасибо заранее!
Вы можете использовать eval
и parse
:
foo <- eval(parse(text = paste("mean(x,", myoptions, ")")))
Более естественным способом сделать то, что вы хотите, является использование 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"
Вот третий ответ, в котором используются 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