Usa la stringa di caratteri come argomento di funzione

Sono sicuro che questo è semplice, ma non riesco a trovare una soluzione … Mi piacerebbe utilizzare una variabile contenente una stringa di caratteri come argomento per una funzione.

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

Ora, qualcosa di simile

 foo <- mean(x, myoptions) 

dovrebbe essere lo stesso di

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

Grazie in anticipo!

Puoi usare eval e parse :

 foo <- eval(parse(text = paste("mean(x,", myoptions, ")"))) 

Un modo più naturale di fare ciò che vuoi è usare do.call . Per esempio,

 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 

Se per qualche motivo vuoi davvero usare una stringa myoptions , puoi sempre usare strsplit per renderlo coerente in una lista. Per esempio,

 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" 

Ecco una terza risposta che utilizza entrambi parse , alist e do.call . La mia motivazione per questa nuova risposta è nel caso in cui gli argomenti vengono passati in modo interattivo da un lato client come caratteri. Quindi immagino che non ci sia un buon modo per non usare parse . Soluzione suggerita con strsplit , non può capire il contesto se una virgola , significa prossimo argomento o prossimo argomento all’interno di un argomento. strsplit non capisce il contesto in quanto strsplit non è un parser.

qui gli argomenti possono essere passati come "a=c(2,4), b=3,5" o 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