将参数传递给一个函数,该函数由另一个函数在R中的名称调用

时间:2019-02-21 21:46:32

标签: r function arguments function-call forecast

我正在使用两个函数,例如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 (...)不起作用,因为Fun1的“ fn”参数仅获得函数的名称,而没有别的。

编辑2:

实际上Fun1baggedModel,而Fun2auto.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部分,不明确提及参数名称

2 个答案:

答案 0 :(得分:2)

假设最后一行下面显示的输入fun1xfun2args运行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

答案 1 :(得分: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的方式与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可以接受任何类型的函数,它不必是直接称为函数的函数。