【问题标题】:Pass ... argument to another function将 ... 参数传递给另一个函数
【发布时间】:2012-09-25 23:49:22
【问题描述】:

我正在编写一个函数 foo(..., lev) 基于包 limma (of bioconductor) 的 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

【问题讨论】:

  • 你为什么首先将... 包裹在list 中?
  • 你能添加你的函数替代代码吗?如果要返回函数,请在名称后添加 () 以调用它。
  • @sgroh: substitute 是 R 中的原语。
  • 对不起,有效的解决方案是你在回答中所说的:)
  • 仍然没有工作示例。如果我们要进一步研究,需要“a”、“b”和“设计”的例子。您似乎认为表达式a+b 将在内部由e[[1]] + e[[2]] 表示。那是错误的。函数表达式的第一个元素是函数名,在本例中为“+”,而您可能希望 e[[3]] 成为参数列表中的第二项。

标签: r


【解决方案1】:

似乎您只需要删除list 调用:

> foo <- function(...) f(substitute(...))
> f <- function(...) eval(...)
> a <- 1; b <- 3
> foo(a+b)
[1] 4

【讨论】:

  • 谢谢贾舒亚。问题是 f(...) 是 pakcage 的一部分并且是这样的: f(...) { e = subsitute(list(...)); . . . }。问题是 e 的值是 list(substitute(...)) 而不是 a + b
  • @AliSharifi:这令人困惑。您能否使用f 的定义、一些示例数据和预期输出来更新您的问题?
  • @AliSharifi:请提供abdesign 的值。
【解决方案2】:

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

【讨论】:

【解决方案3】:

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

【讨论】:

  • 事实并非如此。我不是想将 a + b 作为字符串传递,但这将是一个“未评估”的语句。 f(...) 的真正输入是 a + b 而不是 "a + b"
【解决方案4】:
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

【讨论】:

    猜你喜欢
    • 2020-10-03
    • 2014-01-06
    • 2019-10-09
    • 1970-01-01
    • 2018-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多