我在包limma(bioconductor)的makeContrasts函数的基础上写了一个函数foo(...,lev):
makeContrasts(..., contrasts=NULL, levels)
我想传递foo' as-is'的论点。制作对比。这是我的代码:
foo = function(..., lev) {
e = substitute(list(...))
makeContrasts(e[[2]], levels=lev)
}
foo(a + b, design)
我使用e [[2]]的原因是e将是列表(a + b)而e [[1]]是列表但是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
答案 0 :(得分:2)
好像你只需删除list
电话:
> foo <- function(...) f(substitute(...))
> f <- function(...) eval(...)
> a <- 1; b <- 3
> foo(a+b)
[1] 4
答案 1 :(得分: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
答案 2 :(得分:0)
如果您尝试将+ b作为字符串传递,请添加引号。您还可以将对象设置为“a + b”并传递对象。
答案 3 :(得分: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