r - 依赖于默认参数的函数参数

标签 r function parameter-passing

我正在尝试编写一个在 R 中具有默认参数的函数。最后一个参数告诉我用户希望如何计算变量“g”。默认值为“s + a”(前两个参数的总和),但原则上它可以由任何函数指定(例如“s - a”或“s*a”...)。

myFunc <- function(n, 
                   s = rbernoulli(n, p = 0.5), 
                   a = rnorm(n,sd = 2),
                   g = s + a){
      data.frame(s = factor(s),
                 a = a,
                 g = as.numeric(g>0))
}

如果我调用函数本身,这会很好地工作:

myFunc(5)

要指定我希望如何计算“g”,我想这样做:

myFunc(n = 5, g = a - s) (I)

myFunc(n = 5, a = ., s = ., g = a - s) (II)

似乎(我)会导致 R 在工作区中寻找变量 s/a,这不是我想要的。并且 (II) 不存在,但这是我所说的“为其使用默认计算”的方式。

我尝试用 NULL 指定我的函数,但这也不起作用。请注意,我希望在获得其值后能够在函数中使用“g”(例如,我不能用函数替换它)。

最佳答案

问题是 g 是在调用环境中计算的,而不是在 myFunc 内的环境中计算的。您可以添加一个参数来指定评估 g 的环境,并使用 environment() 的默认值,以便它默认为 myFunc2 中的环境>.

myFunc2 <- function(n, 
                   s = rbernoulli(n, p = 0.5), 
                   a = rnorm(n,sd = 2),
                   g,
                   envir = environment()) {
      g <- if (missing(g)) s + a else eval(substitute(g), envir)
      data.frame(s = factor(s),
                 a = a,
                 g = as.numeric(g>0))
}
myFunc2(n = 5, g = s + a)

关于r - 依赖于默认参数的函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54755882/

相关文章:

r - data.table 子赋值为 `on = `

r - 试图在 ggplot 中加粗 y 轴

python - 如何将整个列表的每个元素除以一个常数

parameter-passing - "pass by reference"是糟糕的设计吗?

java - ProcessBuilder中传递参数返回 "Could not find or load main class"

r - 使用 ggplot2 绘制饼图

r - R 中带有跨图图例的多面板图以及 R 中的 ggtext 和 gridtext

Python函数直接改变列表,而不返回它

c++ - 编译器如何处理仿函数中重载的函数调用运算符?

ruby-on-rails - Rails 在参数中为 M 到 M 关联形成传递数组