web-dev-qa-db-ja.com

関数の引数として文字列を使用する

これは簡単だと思いますが、解決策は見つかりません...関数の引数として文字列を含む変数を使用したいと思います。

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

今、のようなもの

foo <- mean(x, myoptions)

と同じである必要があります

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

前もって感謝します!

23
Kilian

evalおよびparseを使用できます。

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

あなたが望むことをするためのより自然な方法は、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"
11
csgillespie

これは、両方がparsealistおよび_do.call_を使用する3番目の回答です。この新しい答えに対する私の動機は、引数がcharsとしてクライアント側からインタラクティブに渡される場合です。次に、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
_