2

我正在编写一个函数 foo(..., lev) 基于包 limma (生物导体)的 makeContrasts 函数:

makeContrasts(..., contrasts=NULL, levels)

我想将 foo 'as-is' 的 ... 参数传递给 makeContrasts。这是我的代码:

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
4

4 回答 4

2

似乎您只需要删除list呼叫:

> foo <- function(...) f(substitute(...))
> f <- function(...) eval(...)
> a <- 1; b <- 3
> foo(a+b)
[1] 4
于 2012-10-04T21:15:48.120 回答
1

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
于 2012-10-04T22:57:22.650 回答
0

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

于 2012-10-04T21:01:19.547 回答
0
a=3, 
b="test"
 foo = function(...) {
    e = substitute(...)
     eval(e[[3]]) 
}

foo(a + b)

foo(a + b)
[1] "test"

正如其他人所指出的,您的期望仍不清楚。可能您不想要评估,只想要符号:

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

foo(a + b)
# symbol b
#b
于 2012-10-04T21:59:51.303 回答