【发布时间】: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]
我尝试使用<<- 运算符将Qin 设为全局,但是当我尝试从if 语句中打印Qin$Qout 时,我遇到了同样的错误。
有什么解决办法吗?
【问题讨论】:
-
如果您使用
dput()在您的数据对象上发布您的数据,这将更容易复制。 -
不要使用
<<-运算符。你在这里不需要它(真的,你几乎在任何地方都不需要它)。 -
@Gregor,假设有一个对象
a由函数b创建,a将由函数c使用,该函数在b之后被调用。<<-在这种情况下不会有用。或者您更喜欢assign或list2env之类的其他内容,而不是<<-? -
函数应该“创建”对象。函数应该返回分配的对象。如果
b在b之外创建了一些有用的东西,那么b应该return它。如果c需要由包加载的东西,那么它应该作为c的输入参数包含在内。这就是函数式编程的工作方式。 -
如果你开始把东西放到全局环境中(不管你怎么做,
<<-、assign、list2env,或者其他任何东西)你会让你的代码很难使用.如果我的全局环境中已经有了你碰巧使用的名称怎么办?你的函数只是重写了它。如果我想运行函数 10 次并比较结果和中间步骤怎么办?做不到,你的功能覆盖了一切。如果我想并行运行你的函数怎么办?做不到,你的函数必须按顺序运行....