2

パッケージ limma (生体伝導体) の makeContrasts 関数に基づいて、関数 foo(..., lev) を作成しています。

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

foo の ... 引数を「そのまま」makeContrasts に渡したい。これが私のコードです:

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

foo(a + b, design)

私が e[[2]] を使用した理由は、e がlist(a+b)になり、e[[1]] がリストになり、e[[2]] が必要になるからです: a + b

しかし問題は、makeContrast に渡される実際の引数が a + bではなくe[[2]]であることです。じゃあ何をすればいいの?

完全なパラメータ割り当ては次のとおりです。

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=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 に答える
0

a + b を文字列として渡そうとする場合は、引用符を追加してください。オブジェクトを「a + b」に設定して、オブジェクトを渡すこともできます。

于 2012-10-04T21:01:19.547 に答える