【问题标题】:Append Object IF Specified to Data Frame: Errors in User Defined Function-R将对象 IF 指定到数据帧:用户定义函数-R 中的错​​误
【发布时间】:2018-08-31 01:24:39
【问题描述】:

我在尝试使 if else 语句正常工作时遇到了麻烦。本质上,我想要它做的事情如下:如果我的对象 (z) 存在然后附加到我的数据框(结果

以下是我正在尝试完成的可重现示例:

可重现的例子

library(forecast) 


set.seed(1234)
testData <- rnorm(1000)

mFits <- function(data, mod1, mod2 = NULL, mod3 = NULL) {

  # Must at least choose one model to evaluate
  # If mod2, mod3 are specified in the arguments then evaluate 
  m1 <- mod1(data)$fitted

  if (!is.null(mod2)) {
    m2 <- mod2(data)$fitted
  }

  if (!is.null(mod3)){
    m3 <- mod3(data)$fitted
  }

  # Put fitted values into a data frame

  if (!is.ts(m2)) {
    fits <- data.frame(m1)
  }
  else {
    fits <- data.frame(m1, m2)
  }

  if (!is.ts(m3)) {
    fits <- data.frame(m1)
  }
  else {
    fits <- data.frame(m1, m3)
  }

}

modelFit <- mFits(testData, mod1 = auto.arima, mod2 = NULL, mod3 = NULL)
Error in is.ts(m3) : object 'm3' not found

但是,我不断收到错误消息,就像上面的错误一样。我知道 m3 不存在,因为我没有指定它存在。本质上,我想要的是一个数据框,它必须具有来自 m1 的拟合值,并且如果在函数的参数中指定它们,则可以选择附加来自 m2 和 m3 的拟合值。有人能指出我正确的方向吗?我有点不确定下一步该做什么。

谢谢

【问题讨论】:

  • 除非if (!is.null(mod3)){ }里面的代码被执行,否则m3不存在; m2 也一样。需要修改您的测试以解决此问题。

标签: r function if-statement dataframe


【解决方案1】:

m3 &lt;- mod3(data)$fitted 仅在 mod3 不为空时运行,对吗?这里 mod3 为空,所以它不运行。所以代码到达!is.ts时没有定义。

也许你的意思是这样的?

m2<-NULL
m3<-NULL
 if (!is.null(mod2)) {
    m2 <- mod2(data)$fitted
  }

  if (!is.null(mod3)){
    m3 <- mod3(data)$fitted
  }
ret <- data.frame(m1)
if(!is.null(m2)) ret <- cbind(ret,m2)
if(!is.null(m3)) ret <- cbind(ret,m3)
return (ret)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-08
    • 2019-03-22
    • 1970-01-01
    相关资源
    最近更新 更多