【问题标题】:string as function argument in R inside map字符串作为R内部地图中的函数参数
【发布时间】:2021-06-09 20:06:00
【问题描述】:

问题:我有以下 R 代码(如下): 它不适用于“my.list”中的“x”=“ARIMA”和“ETS”。 那就是问题所在: "fabletools::model(arima_auto = fable::ARIMA(Trips))" = 它有效, 但是这个:“fabletools::model(arima_auto = fable::x(Trips))”没有用。 有谁知道我的问题的解决方案。在 R 中甚至可能吗?

library(tidyverse)
library(fable)
library(fabletools)
library(tsibble)

tourism <- tsibble::tourism 

my.list <- list("ARIMA","ETS")

my.list[[1]] ## "ARIMA"
my.list[[2]] ## "ETS"

f_test <- function(.df1,.n){

  x <- .df1[[.n]][[1]] ### 1) "ARIMA", "ETS"
  print(x)
  
  fit <- tourism %>%
    dplyr::filter(Region == "Adelaide") %>%
    #fabletools::model(arima_auto = fable::ARIMA(Trips)) ### it works
    fabletools::model(arima_auto = fable::x(Trips)) ### didn't work
  
  assign("fit", fit, envir= globalenv())
} 

purrr::map(.x = seq(my.list), .f = ~(f_test(my.list, Counter <- .x)))

【问题讨论】:

    标签: r tidyverse rlang fable


    【解决方案1】:

    当您调用 x(Trips) 时,您的 x 是字符向量 "ARIMA"。 R 不知道[character vector](Trips) 是什么意思。这就像尝试调用 "Alice"(y) 并期望 R 将 "Alice" 视为一个函数,即使它显然不是一个函数。

    您想要的是 R 将字符串 "ARIMA" 交换为其相应函数的一种方式。这就是match.fun 的用途。试试这个:

    working<-match.fun(x)
    fabletools::model(arima_auto = working(Trips))
    

    请注意,与您原来的方法不同,我们不需要为此使用任何命名空间。好的做法是找到一种方法来做到这一点,例如working&lt;-get(x,envir = environment(fable)),但我们这里不需要。

    【讨论】: