我可以在后续函数调用中评估参数吗?
Can I evaluate an argument in a subsequent function call?
当我尝试捕获的值可能在母函数内部发生变化时,是否可以在后续函数调用中多次计算函数参数?
我遇到的问题类似于下面的例子。
我在 for
循环中有一个母函数 f1()
和一个子函数 rnorm()
。
子函数应该在循环的每次迭代中接收不同的参数(即 rnorm(n = ii)
,但我想在母函数级别控制它。
f1 <- function(I, n = 1) {
res <- vector("list", length = I)
for (ii in seq_len(I)) {
res[[ii]] <- rnorm(n = n)
}
return(res)
}
f1(I = 2, n = 1)
f1(I = 2, n = ii) # desired, but obviously doesn't work
我试过 eval()
、quote()
、get()
等,但无济于事。
您想要非标准求值,这意味着您需要在求值之前根据函数参数(通常使用 substitute
)修改表达式。
f1 <- function(I, n = 1) {
nval <- substitute(n)
res <- vector("list", length = I)
if (is.numeric(nval)) {
for (ii in seq_len(I)) {
res[[ii]] <- rnorm(n = n)
}
}
if (is.name(nval)) {
for (ii in seq_len(I)) {
res[[ii]] <- eval(substitute(rnorm(n = nval), list(nval = nval)))
}
}
return(res)
}
f1(I = 2, n = 1)
#[[1]]
#[1] 0.4600974
#
#[[2]]
#[1] -0.6399949
f1(I = 2, n = ii)
#[[1]]
#[1] 0.4554501
#
#[[2]]
#[1] 0.7048373 1.0351035
我认为你的例子只是糟糕的软件设计。我强烈建议不要这样做。
更好的方法是:
f1 <- function(I, n) {
res <- vector("list", length = I)
if (missing(n)) {
for (ii in seq_len(I)) {
res[[ii]] <- rnorm(n = ii)
}
} else {
for (ii in seq_len(I)) {
res[[ii]] <- rnorm(n = n)
}
}
return(res)
}
f1(I = 2, n = 1)
f1(I = 2)
当我尝试捕获的值可能在母函数内部发生变化时,是否可以在后续函数调用中多次计算函数参数?
我遇到的问题类似于下面的例子。
我在 for
循环中有一个母函数 f1()
和一个子函数 rnorm()
。
子函数应该在循环的每次迭代中接收不同的参数(即 rnorm(n = ii)
,但我想在母函数级别控制它。
f1 <- function(I, n = 1) {
res <- vector("list", length = I)
for (ii in seq_len(I)) {
res[[ii]] <- rnorm(n = n)
}
return(res)
}
f1(I = 2, n = 1)
f1(I = 2, n = ii) # desired, but obviously doesn't work
我试过 eval()
、quote()
、get()
等,但无济于事。
您想要非标准求值,这意味着您需要在求值之前根据函数参数(通常使用 substitute
)修改表达式。
f1 <- function(I, n = 1) {
nval <- substitute(n)
res <- vector("list", length = I)
if (is.numeric(nval)) {
for (ii in seq_len(I)) {
res[[ii]] <- rnorm(n = n)
}
}
if (is.name(nval)) {
for (ii in seq_len(I)) {
res[[ii]] <- eval(substitute(rnorm(n = nval), list(nval = nval)))
}
}
return(res)
}
f1(I = 2, n = 1)
#[[1]]
#[1] 0.4600974
#
#[[2]]
#[1] -0.6399949
f1(I = 2, n = ii)
#[[1]]
#[1] 0.4554501
#
#[[2]]
#[1] 0.7048373 1.0351035
我认为你的例子只是糟糕的软件设计。我强烈建议不要这样做。
更好的方法是:
f1 <- function(I, n) {
res <- vector("list", length = I)
if (missing(n)) {
for (ii in seq_len(I)) {
res[[ii]] <- rnorm(n = ii)
}
} else {
for (ii in seq_len(I)) {
res[[ii]] <- rnorm(n = n)
}
}
return(res)
}
f1(I = 2, n = 1)
f1(I = 2)