【问题标题】:Passing expression to custom function in R将表达式传递给R中的自定义函数
【发布时间】:2016-09-08 03:36:50
【问题描述】:

我需要在自定义函数中使用replicate(细节不重要,但它涉及随机数生成。

假设我正在使用:rnorm(2)

我知道我可以使用 replicate(10, rnorm(2)) 将表达式重复 10 次

现在,我希望能够在函数中使用replicate,因为我需要对输出进行后处理,并且我还希望能够更改复制的表达式,所以我正在尝试这样的事情:

fn <- function(expression) replicate(10, expression)

但是当我运行该函数时,我得到完全相同的数字重复 10 次:

fn(rnorm(2))

我知道fn 得到rnorm(2) 的结果,这就是它重复数字的原因,所以我需要告诉fn 不要评估expression。我一直在研究这个,似乎我需要在fn 中使用substitute,但我无法让它工作。

【问题讨论】:

  • 你会对fn1 &lt;- function(FUN,...){ sapply(seq_len(10),FUN = FUN,...)}; fn1(rnorm,n = 2)不满意吗?
  • 我想将参数传递给表达式,但也要在表达式之外(比如要复制的次数),所以我做了:myfn &lt;- function(a, b, c) a*b*rnorm(c); fn1 &lt;- function(times, FUN, ...){ sapply(seq_len(times), FUN=FUN, ...)}; fn1(times=10, FUN=myfn, 1, 2, 3);但我得到了:Error in FUN(X[[i]], ...) : unused argument (3) 知道为什么这不起作用吗?

标签: r


【解决方案1】:

如果你只是想传递思想,你可以使用...like

fn <- function(...) replicate(10, ...)

这不允许您与该特定参数进行交互,并且假定您要传递所有参数。

您可以捕获表达式并将其传递给

fn <- function(a) do.call("replicate", list(10, substitute(a)))

也是。您需要使用do.call 将未计算的表达式传递给`replicate。

【讨论】:

  • 谢谢,它有效!您能否详细说明为什么使用... 有效?
猜你喜欢
  • 2011-06-09
  • 2020-09-07
  • 1970-01-01
  • 2010-11-14
  • 1970-01-01
  • 2012-06-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多