R 通过。。。另一个函数的参数

R 通过。。。另一个函数的参数,r,R,我正在写一个函数foo(…,lev),该函数基于limma(bioconductor)包的makeControls函数: 我想通过考试。。。用foo'as is'的参数进行对比。这是我的密码: foo = function(..., lev) { e = substitute(list(...)) makeContrasts(e[[2]], levels=lev) } foo(a + b, design) 我使用e[[2]]的原因是,e将list(a+b)而e[[1]]是li

我正在写一个函数foo(…,lev),该函数基于limma(bioconductor)包的makeControls函数:

我想通过考试。。。用foo'as is'的参数进行对比。这是我的密码:

foo = function(..., lev) {
    e = substitute(list(...))
    makeContrasts(e[[2]], levels=lev)
}

foo(a + b, design)
我使用e[[2]]的原因是,e将list(a+b)而e[[1]]是list但e[[2]]是我需要的:a+b

但问题是传递给makeContrast的实际参数是e[[2]],而不是a+b。 那怎么办呢

完整的参数分配如下所示:

ct = factor(c("a","b"))
design = model.matrix(~0+ct)
colnames(design)=levels(ct)
makeContrasts(a+b,levels=design) # It works
foo(a+b, design) # Does not work

如果您试图将a+b作为字符串传递,请添加引号。您还可以将对象设置为“a+b”并传递该对象。

似乎只需删除
列表
调用:

> foo <- function(...) f(substitute(...))
> f <- function(...) eval(...)
> a <- 1; b <- 3
> foo(a+b)
[1] 4
>foofa
正如其他人指出的,你的期望仍然不明确。您可能不需要求值,只需要符号:

foo = function(...) {
    e = substitute(...); str( e[[3]])
    return(e[[3]]) 
}

foo(a + b)
# symbol b
#b

A可能过于简化了问题,但下面的方法是否有效

foo = function(..., lev) {
 makeContrasts(...,levels =lev)
}

foo(a + b,b+c, lev =letters[1:3])


## Contrasts
## Levels a + b b + c
## a     1     0
## b     1     1
## c     0     1
以你为例 我似乎没有过分简化

如果
..
包含要传递给另一个函数的参数,则只需将
..
传递给该函数即可<代码>…

ct = factor(c("a","b"))
design = model.matrix(~0+ct)
colnames(design)=levels(ct)
makeContrasts(a+b,levels=design) 
## Contrasts
## Levels a + b
##  a     1
##  b     1
foo(a+b, lev = design)
## Contrasts
## Levels a + b
##  a     1
##  b     1

为什么您首先要将
..
包装在
列表中
中?您可以添加您的函数替换代码吗?如果您要返回一个函数,请在调用该函数的名称后添加()。@sgroh:
substitute
是R中的一个原语。很抱歉,有效的解决方案是您在回答中所说的:)仍然没有工作示例。如果我们要进一步研究这个问题,我们需要“a”、“b”和“设计”的例子。您似乎认为表达式
a+b
将在内部由
e[[1]]+e[[2]]
表示。这是错误的。函数表达式的第一个元素是函数名,在本例中为“+”,而您可能需要e[[3]],它将是参数列表中的第二项。情况并非如此。我不想将a+b作为字符串传递,但它将是一个“未赋值”语句。f(…)的真正输入是a+b,而不是“a+b”,谢谢Jashua。问题是f(…)是pakcage的一部分,类似这样:f(…){e=substitute(list(…);…}。问题是e的值将是list(替换(…),而不是a+b@AliSharifi:那太令人困惑了。您能用
f
的定义、一些示例数据和预期输出更新您的问题吗?@AliSharifi:请提供
a
b
设计的值。谢谢。你简单的回答很完美。然而,我不明白当这些对象不存在时,R是如何解释“a+b”的,如果我想修改。。。我将提出一个新的问题,R如何解释。。。论点没有---已经有问题搜索了[r]省略号
foo = function(..., lev) {
 makeContrasts(...,levels =lev)
}

foo(a + b,b+c, lev =letters[1:3])


## Contrasts
## Levels a + b b + c
## a     1     0
## b     1     1
## c     0     1
ct = factor(c("a","b"))
design = model.matrix(~0+ct)
colnames(design)=levels(ct)
makeContrasts(a+b,levels=design) 
## Contrasts
## Levels a + b
##  a     1
##  b     1
foo(a+b, lev = design)
## Contrasts
## Levels a + b
##  a     1
##  b     1