You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用rpy2从Python调用R的forecast::stlm()时出现'missing value where TRUE/FALSE needed'错误的解决方法咨询

使用rpy2从Python调用R的forecast::stlm()时出现'missing value where TRUE/FALSE needed'错误的解决方法咨询

看起来你遇到的这个错误,本质是forecast::stlm()在使用method="ets"的分支逻辑里,尝试检查外部回归项xreg的列数,但xreg的状态不符合预期——当它是NULL时,ncol(NULL)会返回NULL,而if判断需要明确的TRUE/FALSE值,因此触发了报错。

下面是两种可行的解决办法,你可以根据需求选择:

方法1:调用时显式传入xreg=NULL

在Python调用error_wrapper.fit()的时候,直接明确告诉stlm()不需要外部回归项,显式传入xreg=ro.r['NULL'],这样就能跳过stlm()内部对xreg列数的异常判断:

修改后的调用代码如下:

out = error_wrapper.fit(y= y_ts, FUN = ro.r['stlm'], method = "ets", xreg = ro.r['NULL'])

方法2:在R包装函数中自动补全xreg=NULL

如果不想每次调用都手动传这个参数,可以修改你的Rfit函数,让它自动在参数列表中添加xreg=NULL(当未显式传入该参数时),从根源上避免异常分支的触发:

修改后的R函数定义:

fit <- function(y, FUN, ...) {
  arguments <- list(...)
  names(arguments) <- gsub("_", ".", names(arguments))
  # 若未传入xreg,自动添加xreg=NULL
  if (!"xreg" %in% names(arguments)) {
    arguments$xreg <- NULL
  }
  arguments <- c(list(y = y), arguments)
  model.fit <- tryCatch({
    do.call(FUN, arguments, quote = TRUE)
  }, error = function(err) {
    stop(err)
  })
  print( summary(model.fit) )
  return(model.fit)
}

小提示

另外还有两个小优化点可以参考:

  1. 你的R包装函数里的tryCatch只是重新抛出错误,没有额外处理逻辑,如果不需要自定义错误提示,可以直接去掉tryCatch,简化代码;
  2. 在rpy2中导入forecast包时,用importr会更规范,代替直接调用ro.r('library(forecast)')
from rpy2.robjects.packages import importr
forecast = importr('forecast')

内容来源于stack exchange

火山引擎 最新活动