【问题标题】:R:creating a data frame inside if statementR:在if语句中创建一个数据框
【发布时间】:2018-01-16 21:46:28
【问题描述】:

我试图在 if 语句中创建一个数据框,但是当我在 else 范围内使用此数据框时,我收到以下错误:

错误:$ 运算符对原子向量无效

这是我的代码的一部分:

for(i in 1:numOfTrays){
if (i == 1){
  parameters <- c(Qin=Qin,A=A)
  state <- c(h=h0)
  time <- seq(0,200,by=1)
  out <- ode(y= state, func = FluidH, parms = parameters, times = time)
  Qout <- cbind(out[,1],VFRoutput((out[,2])))
  colnames(Qout)<-c("time","Qout")
  Qin <- as.data.frame(Qout)
  #write.csv(Qin,"Qin")
}
else{

  for (j in 1:length(Qin$Qout)){
    h <- h0 + ((Qin$Qout[j]-VFRoutput(h0))/A)*Qin$time[j]

我尝试使用&lt;&lt;- 运算符将Qin 设为全局,但是当我尝试从if 语句中打印Qin$Qout 时,我遇到了同样的错误。

有什么解决办法吗?

【问题讨论】:

  • 如果您使用dput() 在您的数据对象上发布您的数据,这将更容易复制。
  • 不要使用&lt;&lt;- 运算符。你在这里不需要它(真的,你几乎在任何地方都不需要它)。
  • @Gregor,假设有一个对象a 由函数b 创建,a 将由函数c 使用,该函数在b 之后被调用。 &lt;&lt;- 在这种情况下不会有用。或者您更喜欢assignlist2env 之类的其他内容,而不是&lt;&lt;-
  • 函数应该“创建”对象。函数应该返回分配的对象。如果bb 之外创建了一些有用的东西,那么b 应该return 它。如果c 需要由包加载的东西,那么它应该作为c 的输入参数包含在内。这就是函数式编程的工作方式。
  • 如果你开始把东西放到全局环境中(不管你怎么做,&lt;&lt;-assignlist2env,或者其他任何东西)你会让你的代码很难使用.如果我的全局环境中已经有了你碰巧使用的名称怎么办?你的函数只是重写了它。如果我想运行函数 10 次并比较结果和中间步骤怎么办?做不到,你的功能覆盖了一切。如果我想并行运行你的函数怎么办?做不到,你的函数必须按顺序运行....

标签: r dataframe


【解决方案1】:

虽然您的示例不可重现,但我冒昧猜测 Qout 存在于 if 语句之前作为矩阵或某种类型(可能没有列名)。这是一个可重现的示例:

Qout <- matrix(NA, nrow = 3, ncol = 3)

chk <- TRUE

if (chk) {
  out <- as.data.frame(Qout)
} else {
  Qout$col1
}

Qout <- matrix(NA, nrow = 3, ncol = 3)
chk <- FALSE

if (chk) {
  out <- as.data.frame(Qout)
} else {
  Qout$col1
}

Error in Qout$col1 : $ operator is invalid for atomic vectors

因此,您需要确保在 else 语句中,您正在处理一个支持 $ 子集的对象 - 例如 data.frame

【讨论】:

  • 如果我将您的示例与我的代码进行比较,我会写 out$col1 而不是 Qout$col1,但我仍然会收到 out 是原子向量的错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-28
  • 1970-01-01
  • 1970-01-01
  • 2016-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多