3

我不明白为什么我的 oh-so-minimal 包装函数会产生主题错误。下面应该重现它。我的目标是从单个数据框中的数据中绘制一堆图,每个图都位于一个新窗口中。

library(ggplot2)
library(datasets)
data(ChickWeight)
str(ChickWeight)

# This works fine:
qplot(x = weight, y = Time, data = ChickWeight, color = Diet)

myfun <- function(pred = weight, resp = Time, dat = ChickWeight) {
  windows()
  qplot(x = pred, y = resp, data = dat, color = Diet)
}

# But this returns 'Error in eval(expr, envir, enclos) : object 'weight' not found':
myfun()
# As does this
myfun(weight, Time)

为什么 R 在我的函数中找不到“权重”?

我在 Windows 8.1 64 位上运行 R 版本 3.0.1,64 位。

谢谢!

-罗伊

4

2 回答 2

5

我建议从长远来看,这样的事情将是一个好主意:

myfun <- function(pred = "weight", resp = "Time", dat = ChickWeight) {
    dev.new()  ## more general than windows()
    ggplot(dat,aes_string(x=pred,y=resp,color="Diet"))+geom_point()
}
myfun()

qplot在将对象传入和传出函数的上下文中,会进行许多花哨的评估,这些评估将是脆弱的(容易破坏,难以理解)。aes_string指定ggplot它的查找应该基于一个字符串的值,而不是它通常的评估语言对象的方法(即使用"weight"而不是weight)。

于 2013-11-11T01:37:47.277 回答
2

我使用石英设备而不是 windows() 但否则这主要是成功的:

myfun <- function(pred = 'weight', resp = 'Time', dat = ChickWeight) {
  quartz()
  qplot(x =dat[[pred]], y = dat[[resp]],  color = dat[["Diet"]])
}
于 2013-11-11T01:29:57.820 回答