【发布时间】:2015-02-26 21:56:55
【问题描述】:
我有一个函数,它基本上从参数中输出一个布尔条件作为字符串(函数的细节在这里无关紧要)
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
所以我有两个问题:
- 您能否解释一下导致将其作为参数值而不是实际字符串值的 R 内部机制?
- 我该如何解决这个问题,即获取参数列表中的字符串值?
谢谢
【问题讨论】:
-
请制作您的样品reproducible。包括一个我们可以测试的最小数据集。显示您实际上是如何调用
mapply()。 -
已编辑,对此感到抱歉
-
我无法在此示例中使用“$conjunction”重现您的错误。有一个“[4L]”的事实让我觉得某处“连词”拼写错误,或者某处有一个额外的逗号。
-
你的函数真的需要命名参数吗?如果没有,而您只想为所有人做点什么,那么
makeClause <-function(...) {arglist = list(...)} -
@MrFlick,但是这样做会丢失参数匹配和潜在的重新排序。