我使用两个函数,比如Fun1
和Fun2
,两者都在一个包中定义,所以我无法改变它们。 Fun1
称Fun2
如下:
Fun1(x=a_number,y=a_string,fn=Fun2,...)
其中...
是Fun2
使用的参数。
因此,Fun1
以其名字命名为Fun2
。如何在不显式调用参数名称的情况下将参数传递给Fun2
?
假设args
是我想传递给Fun2
的参数列表。如果我只想打电话给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
创建partials(已填充某些参数的函数)
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作为参数(我们只是拼接,需要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
可以接受任何类型的函数,它不必是文字命名函数。