0

我正在使用两个函数,比如说Fun1Fun2,它们都定义在一个包中,所以我无法更改它们。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 (...)不起作用,因为“fn”参数Fun1只获取函数的名称,没有别的。

编辑2:

实际上Fun1isbaggedModelFun2is 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而不明确提及参数的名称

4

2 回答 2

2

假设最后一行下面显示的输入、 和运行fun1fun1 xfun2args

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
于 2019-02-21T22:18:46.707 回答
1

使用来自@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使用 is创建,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可以接受任何类型的函数,它不必是文字命名函数。

于 2019-02-22T03:49:46.280 回答