[英]Use character string as function argument
我確定這很簡單,但我找不到解決方案......我想使用一個包含字符串的變量作為函數的參數。
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
使用所有do.call
、 eval
和parse
(結合 kohske 和 csgillespie 的答案,以及WoDoSc 對“將逗號分隔的字符串作為列表傳遞”的回答):
x <- c(1:10)
myoptions <- "trim = 0, na.rm = FALSE"
do.call(
what = mean,
args = append(list(x = x), eval(parse(text = paste0("list(", myoptions, ")"))))
)
在更復雜的情況下,此解決方案可以非常靈活,如下所示。
myfn <- function(x, y = 0, z = 0, ...) {
print(paste("x:", x))
print(paste("y:", y))
print(paste("z:", z))
if (length(list(...)) > 0) {
print("other:")
print(list(...))
}
}
myextraargs <- paste(
"y = c(11, 14), z = 47,",
"t = data.frame(p = c('apple', 'plum'), j = c(7, 2), k = c(3, 21))"
)
do.call(
what = myfn,
args = append(
list(x = 7),
eval(parse(text = paste0("list(", myextraargs, ")")))
)
)
結果是:
[1] "x: 7"
[1] "y: 11" "y: 14"
[1] "z: 47"
[1] "other:"
$t
p j k
1 apple 7 3
2 plum 2 21
...和...
myextraargs <- NULL
do.call(
what = myfn,
args = append(
list(x = 7),
eval(parse(text = paste0("list(", myextraargs, ")")))
)
)
結果是
[1] "x: 7"
[1] "y: 0"
[1] "z: 0"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.