gpt4 book ai didi

r - 尽管在函数外工作,ggplot 在函数内仍无法正常工作 - R

转载 作者:行者123 更新时间:2023-12-05 00:27:23 25 4
gpt4 key购买 nike

我正在尝试创建一个函数,该函数接受 2 个参数并为它们输出适当的 ggplot。该代码手动完美运行,但不知何故我无法使其在函数包装器中工作。

返回的错误是

Error in eval(expr, envir, enclos) : object 'TimeVector' not found

我尝试通过强制将未找到的对象作为字符串添加到 ggplot 来纠正该问题。
这反过来又会产生不同形式的麻烦
Error: Discrete value supplied to continuous scale

删除 scale_x_continuous(breaks=0:24) 修复了第二个错误,但输出一个空图,表明 ggplot 根本没有输入任何数据。

数据是按时间分组的交通密度观察的大数据框。它看起来像这样:
ID                   Road Status                Time Statusint Day  Months Year Weekday

1 Me7war To Sheikh Zayid Orange 2012-10-01 00:03:00 3 1 October 12 Monday
1 Me7war To Sheikh Zayid Green 2012-10-01 05:00:00 2 1 October 12 Monday
1 Me7war To Sheikh Zayid Yellow 2012-10-01 05:24:00 5 1 October 12 Monday

我正在尝试针对“时间”变量绘制“Statusint”变量,它是从 1(良好的流量)到 5(糟糕的流量)范围内的状态整数的缩写。 “时间”的格式为 Posix,因此我创建了一个名为“TimeVector”的数字向量,其唯一目的是在 ggplot 中进行绘图。

功能如下:
Plotroad <- function( roadID , Day ) {

*** Working Code ***

else {

### THE PROBLEM CODE: Everything below works manually, but returns an error in the function

Roadsubset <- October[October$ID == as.numeric(roadID), ]
Timesubset <- subset(Roadsubset, format(Roadsubset$Time,'%d') == "Day" )
TimeVector <- as.numeric(gsub(":" , "." , strftime(Timesubset$Time, format="%H:%M")))

ggplot(Timesubset, aes( x = "TimeVector", y = "Timesubset$Statusint")) + geom_point() +
stat_smooth() + scale_x_continuous(breaks=0:24)


### The working code:
Roadsubset <- October[October$ID == as.numeric(roadID), ]
Timesubset <- subset(Roadsubset, subset = Roadsubset$Day == as.integer(Date) )
TimeVector <- as.numeric(gsub(":" , "." , strftime(Timesubset$Time, format="%H:%M")))
Timesubset$timevector <- TimeVector

print(ggplot( data = Timesubset, aes_string( x = "timevector" , y = "Statusint" )) + geom_point() + stat_smooth() + scale_x_continuous(breaks=0:24) + labs(list(title = as.character(Timesubset$Road[1]) , x = "Time of Day", y = "Status")))

}
}

我见过一些 advice建议使用打印,因为 ggplot 不是在命令行中调用的。但是,这并不能解决上述错误。

这是我第一篇关于堆栈溢出的帖子,所以如果需要,请指出我如何更好地为 future 格式化问题。谢谢。

最佳答案

除了使用变量名之外,还有一个作用域问题。 GGPlot 在全局环境中执行非标准评估,因此您的函数中定义的任何内容都不能直接访问,除了“数据”参数,因为该参数是明确传递的,而不是通过非标准评估。因此,解决此问题的一种方法是将变量添加到数据参数中。我创建了一个我认为模仿您的问题的示例,但由于我没有您的数据,因此它不完全相同:

gg_fun <- function() {
data <- data.frame(a=1:10, b=1:10)
clr <- rep(c("a", "b"), 5)
ggplot(data, aes(x=a, y=b, color=clr)) + geom_point()
}
gg_fun()
# Error in eval(expr, envir, enclos) : object 'clr' not found
gg_fun <- function() {
data <- data.frame(a=1:10, b=1:10)
clr <- rep(c("a", "b"), 5)
data$clr <- clr
ggplot(data, aes(x=a, y=b, color=clr)) + geom_point()
}
gg_fun() # works

在您的情况下,您需要添加 TimeVectorTimesubset (微不足道),然后使用未加引号的 aes句法:
ggplot(Timesubset, aes(x=TimeVector, y=Statusint)) ...

关于r - 尽管在函数外工作,ggplot 在函数内仍无法正常工作 - R,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20845668/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com