[英]Using match.call() with mapply
我有一个函数,基本上从参数输出一个布尔条件作为字符串(函数的细节在这里无关紧要)
makeClause <-function(Sex=c("NA", "male", "female"),
SmokingHx=c("NA", "current", "former", "never"),
conjunction=c("&", "|")) {
arglist = as.list(match.call())
return(arglist)
}
我有一个包含输入参数的所有组合的数据框,如下所示:
Sex SmokingHx conjunction
1 NA NA &
2 Male NA &
...
我以这种方式获得:
combinations = expand.grid(Sex=c("NA", "male", "female"),
SmokingHx=c("NA", "current", "former", "never"),
conjunction=c("&", "|"),
stringsAsFactors=FALSE)
我呼吁makeClause
与mapply
:
mapply(makeClause, Sex=combinations$Sex,SmokingHx=combinations$SmokingHx, conjunction=combinations$conjunction)
看看arglist
变量我得到:
$Sex
dots[[1L]][[1L]]
$SmokingHx
dots[[2L]][[1L]]
$conjunction
dots[[4L]][[1L]]
如果不是as.list(match.call())
而是调用as.list(environment())
我改为:
$Sex
[1] "male"
$SmokingHx
[1] "NA"
$conjunction
dots[[4L]][[1L]] # notice this is the only one for which I don't get the actual string
所以我有两个问题:
谢谢
match.call
将引用的调用捕获为语言对象。 dots
业务是mapply
用于调用函数的函数,因此match.call
的返回值是正确的。 它只是匹配为您的函数构造的mapply
并返回引用(即未评估)值的调用。 内部mapply
正在做这样的事情(虽然不是因为它是内部C代码):
dots <- list(...)
call <- list()
for(j in seq_along(dots[[1]])) {
for(i in seq_along(dots)) call[[i]] <- bquote(dots[[.(j)]][[.(i)]])
eval(as.call(c(quote(FUN), call))))
}
如果你看as.call(c(FUN, call))
你会看到类似FUN(dots[[1L]][[1L]], dots[[1L]][[2L]], dots[[1L]][[3L]])
,这有助于解释为什么你得到你得到的结果。
你似乎想要你的论点的价值观 。 你可以评估你从match.call
得到什么,或者更简单,只需使用:
list(Sex, SmokingHx, conjunction)
如果你想要的东西可以获得你的函数的所有参数而不必知道它们的名字,你可以做类似的事情:
mget(names(formals()))
尝试(为了清晰起见,简化乐趣):
makeClause <-function(Sex, SmokingHx, conjunction) mget(names(formals()))
with(combinations, t(mapply(makeClause, Sex, SmokingHx, conjunction)))
生产:
Sex SmokingHx conjunction
NA "NA" "NA" "&"
male "male" "NA" "&"
female "female" "NA" "&"
NA "NA" "current" "&"
male "male" "current" "&"
female "female" "current" "&"
... further rows omitted
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.