将参数传递给一个函数,该函数由另一个函数通过其在 R 中的名称调用
Passing arguments to a function which is called by another function by its name in R
我正在使用两个函数,比如 Fun1
和 Fun2
,它们都在一个包中定义,所以我无法更改它们。 Fun1
调用 Fun2
如下:
Fun1(x=a_number,y=a_string,fn=Fun2,...)
其中 ...
是 Fun2
使用的参数。
所以 Fun1
正在通过它的名字调用 Fun2
。如何在不显式调用参数名称的情况下将参数传递给 Fun2
?
假设 args
是我要传递给 Fun2
的参数列表。如果我想调用 only Fun2
很简单,如下所示:
do.call(Fun2,args)
但是如果Fun2
被Fun1
以它的名字调用,这种方式就不起作用了。唯一的办法就是显式写参数如下:
Fun1(x=a_number,y=a_string,fn=Fun2,param1=sth,param2=some_other_thing)
但是这种方式对我不起作用,因为 Fun2
的参数太多(不只是 2 个),而且我不知道用户想要更改哪些参数。也许用户只是想改变param1,而其他的保持默认。
顺便说一句,下面的代码不起作用,因为 Fun1
除了函数名之外不接受任何参数作为其 'fn' 参数:
Fun1(x=a_number,y=a_string,fn=do.call(Fun2,args))
编辑 1:
fn=Fun2 (...)
不起作用,因为 Fun1
的“fn”参数仅获取函数名称,没有别的。
编辑 2:
实际上Fun1
是baggedModel
,Fun2
是auto.arima
,它们都在预测包中。这是一个例子:
vec.ts=ts(1:27,start=c(2016,1),frequency=12) #time series
num_blocks=3
block_size=24
baggedModel(vec.ts,
bootstrapped_series = bld.mbb.bootstrap(vec.ts,num_blocks,block_size),
fn=auto.arima,...)
所以,我正在寻找一种方法将一些参数传递给 ...
部分,这些参数将由 auto.arima
函数使用,而不明确提及参数名称.
假设最后一行下面显示的输入 fun1
、x
、fun2
和 args
运行 fun1。
fun1 <- function(x, fn, ...) fn(x) + fn(...)
x <- 3:4
fun2 <- sum
args <- list(1, 2)
do.call("fun1", c(list(x, fun2), args))
## [1] 10
使用来自@GGrothendieck 的简化示例。您还可以使用 purrr
来创建部分函数(已经填充了一些参数的函数)
library(purrr)
fun1 <- function(x, fn, ...) fn(x) + fn(...)
x <- 3:4
args <- list(1,2)
fun2 <- sum
fun3 <- partial(fun2, !!!args)
fun1(x, fun3)
这里我们创建fun3
,就像fun
一样,但是1和2已经作为参数传递(我们只是拼接in,要求purrr >0.3)。
在 baggedModel
示例中,您也可以只传入一个匿名函数,而不必理会省略号
vec.ts=ts(1:27,start=c(2016,1),frequency=12) #time series
num_blocks=3
block_size=24
baggedModel(vec.ts,
bootstrapped_series = bld.mbb.bootstrap(vec.ts, num_blocks, block_size),
fn=function(...) auto.arima(..., d=NA, D=NA)) # or whatever params you want
baggedModel
可以接受任何类型的函数,不必是字面命名函数。
我正在使用两个函数,比如 Fun1
和 Fun2
,它们都在一个包中定义,所以我无法更改它们。 Fun1
调用 Fun2
如下:
Fun1(x=a_number,y=a_string,fn=Fun2,...)
其中 ...
是 Fun2
使用的参数。
所以 Fun1
正在通过它的名字调用 Fun2
。如何在不显式调用参数名称的情况下将参数传递给 Fun2
?
假设 args
是我要传递给 Fun2
的参数列表。如果我想调用 only Fun2
很简单,如下所示:
do.call(Fun2,args)
但是如果Fun2
被Fun1
以它的名字调用,这种方式就不起作用了。唯一的办法就是显式写参数如下:
Fun1(x=a_number,y=a_string,fn=Fun2,param1=sth,param2=some_other_thing)
但是这种方式对我不起作用,因为 Fun2
的参数太多(不只是 2 个),而且我不知道用户想要更改哪些参数。也许用户只是想改变param1,而其他的保持默认。
顺便说一句,下面的代码不起作用,因为 Fun1
除了函数名之外不接受任何参数作为其 'fn' 参数:
Fun1(x=a_number,y=a_string,fn=do.call(Fun2,args))
编辑 1:
fn=Fun2 (...)
不起作用,因为 Fun1
的“fn”参数仅获取函数名称,没有别的。
编辑 2:
实际上Fun1
是baggedModel
,Fun2
是auto.arima
,它们都在预测包中。这是一个例子:
vec.ts=ts(1:27,start=c(2016,1),frequency=12) #time series
num_blocks=3
block_size=24
baggedModel(vec.ts,
bootstrapped_series = bld.mbb.bootstrap(vec.ts,num_blocks,block_size),
fn=auto.arima,...)
所以,我正在寻找一种方法将一些参数传递给 ...
部分,这些参数将由 auto.arima
函数使用,而不明确提及参数名称.
假设最后一行下面显示的输入 fun1
、x
、fun2
和 args
运行 fun1。
fun1 <- function(x, fn, ...) fn(x) + fn(...)
x <- 3:4
fun2 <- sum
args <- list(1, 2)
do.call("fun1", c(list(x, fun2), args))
## [1] 10
使用来自@GGrothendieck 的简化示例。您还可以使用 purrr
来创建部分函数(已经填充了一些参数的函数)
library(purrr)
fun1 <- function(x, fn, ...) fn(x) + fn(...)
x <- 3:4
args <- list(1,2)
fun2 <- sum
fun3 <- partial(fun2, !!!args)
fun1(x, fun3)
这里我们创建fun3
,就像fun
一样,但是1和2已经作为参数传递(我们只是拼接in,要求purrr >0.3)。
在 baggedModel
示例中,您也可以只传入一个匿名函数,而不必理会省略号
vec.ts=ts(1:27,start=c(2016,1),frequency=12) #time series
num_blocks=3
block_size=24
baggedModel(vec.ts,
bootstrapped_series = bld.mbb.bootstrap(vec.ts, num_blocks, block_size),
fn=function(...) auto.arima(..., d=NA, D=NA)) # or whatever params you want
baggedModel
可以接受任何类型的函数,不必是字面命名函数。