【问题标题】:Using match.call() with mapply将 match.call() 与 mapply 一起使用
【发布时间】: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)

我打电话给makeClausemapply

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

所以我有两个问题:

  1. 您能否解释一下导致将其作为参数值而不是实际字符串值的 R 内部机制?
  2. 我该如何解决这个问题,即获取参数列表中的字符串值?

谢谢

【问题讨论】:

  • 请制作您的样品reproducible。包括一个我们可以测试的最小数据集。显示您实际上是如何调用mapply()
  • 已编辑,对此感到抱歉
  • 我无法在此示例中使用“$conjunction”重现您的错误。有一个“[4L]”的事实让我觉得某处“连词”拼写错误,或者某处有一个额外的逗号。
  • 你的函数真的需要命名参数吗?如果没有,而您只想为所有人做点什么,那么 makeClause &lt;-function(...) {arglist = list(...)}
  • @MrFlick,但是这样做会丢失参数匹配和潜在的重新排序。

标签: r mapply


【解决方案1】:

为什么会这样:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-17
    • 2018-10-09
    • 2012-11-17
    • 1970-01-01
    • 2021-05-20
    • 1970-01-01
    相关资源
    最近更新 更多