R 通过。。。另一个函数的参数
我正在写一个函数foo(…,lev),该函数基于limma(bioconductor)包的makeControls函数: 我想通过考试。。。用foo'as is'的参数进行对比。这是我的密码: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 = 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