3

我有一个函数,它基本上从参数中输出一个布尔条件作为字符串(函数的细节在这里无关紧要)

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. 我该如何解决这个问题,即获取参数列表中的字符串值?

谢谢

4

1 回答 1

3

为什么会这样:

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
于 2015-02-26T22:29:55.770 回答