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