【问题标题】:Plot function by using predefined variables in R使用 R 中的预定义变量绘制函数
【发布时间】:2026-01-23 16:45:03
【问题描述】:

我想在 R 中创建一个类。我有很多表,我想通过一个函数来绘制它们。我使用的代码是:

temp <- data.frame(gsbi1_30,gsbi1_29,ob_30,ob_29)

其中 gsbi1_30,gsbi1_29,ob_30,ob_29 是表。

par(mfrow=c(2,2))
for (i in temp){ plot(i$ambtemp,type="o", pch=22, lty=2, col="brown",xlab = "Hour  2007/09/29" , ylab= "Ambient Tempreture" )
                 title(main="Hourly Mean, node 25", col.main="brown", font.main=1) }

我想出了这个错误:

Error in plot(i$ambtemp, type = "o", pch = 22, lty = 2, col = "brown",  : 
  error in evaluating the argument 'x' in selecting a method for function 'plot': Error in i$ambtemp : $ operator is invalid for atomic vectors

样本数据:

-0.6 -1.2 -1.0 -0.8 -0.4 -0.2

所有其他样本都在相同的结构中。

【问题讨论】:

  • 你能添加一些代码来为变量 gsbi 和 ob 生成一些虚拟值吗?这将帮助其他人帮助您。
  • @BlueTrin,你说的代码是什么意思?我把我的代码放在问题中。并更新了相应的错误。
  • @Topdombili 我认为 BlueTrin 的意思是给我们一些 gsbi1_30,gsbi1_29,ob_30,ob_29 的数据
  • @Topdombili 或者只是添加 str(gsbi1_30) 和一个解释你想要绘制什么的句子?哪些变量?
  • 对不起,ECII是对的,这就是我的意思。

标签: r function automation plot


【解决方案1】:

问题是您不应该首先将temp 创建为data.frame。如果 gsbi1_30、gsbi1_29、ob_30 和 ob_29 本身就是 data.frames(我怀疑),data.frame() 将结合它们的列来生成一个大的 data.frame。

相反,创建一个list

temp <- list(gsbi1_30,gsbi1_29,ob_30,ob_29)

并使用lapply() 对其进行迭代(for 循环在 R 中非常低效):

par(mfrow=c(2,2))
lapply(temp, function(i) {
    plot(i$ambtemp, type = "o", pch = 22, lty = 2, col = "brown", xlab = "Hour  2007/09/29" , ylab = "Ambient Tempreture")
})

【讨论】:

  • +1 可以很好地猜测出了什么问题(我们将看看 OP 是否确认)。您对“for 循环在 R 中的效率非常低”是错误的,但是(至少它比这更微妙):*.com/questions/2275896/… 当然对于这种情况(创建四个图)我看不出它有什么不同
  • 你可以写成lapply(lapply(temp,"[[","ambtemp"),plot, type="o", pch=22, lty=22, ...)
  • @BenBolker 非常感谢您直言不讳。当然,创建几个地块并不是一项对性能至关重要的任务。无论如何,我相信使用apply 家族可以帮助人们“矢量化”他们的想法,你不同意吗?
  • 我同意——从长远来看,它让apply 变得更好。在短期内,当人们试图解决问题时,我会尽量小心增加他们的认知负荷。我宁愿阅读带有apply 的代码而不是for,但是如果for 循环对于给定的问题工作得很好......
  • 我认为我的感受得到了事实的证实,即 OP 现在正在处理另一个问题 *.com/questions/14203567/…,他们对 lapply 的语法感到困惑。如果他们坚持使用for 循环,他们现在会更好......
最近更新 更多