使用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) }
小提示
另外还有两个小优化点可以参考:
- 你的R包装函数里的
tryCatch只是重新抛出错误,没有额外处理逻辑,如果不需要自定义错误提示,可以直接去掉tryCatch,简化代码; - 在rpy2中导入
forecast包时,用importr会更规范,代替直接调用ro.r('library(forecast)'):
from rpy2.robjects.packages import importr forecast = importr('forecast')
内容来源于stack exchange




