Вот третий ответ, который использует 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