我一直在尝试编写一个R代码,该代码从excel文件中读取数据,并使用ggplot包根据用户输入绘制不同的图表图表(如:bar,line,point或pie)。 / p>
为此,我使用了3-4种不同的功能:
1)条形图的功能:
bar <- function() {
plot <- ggplot (data= df, aes(x= Dates, y= Values))
barPlot <- plot + geom_bar(stat="identity", fill="red", width=1)
print(barPlot)
}
2)同样,对于线图:
line <- function() {
plot <- ggplot (data= df, aes(x= Dates, y= Values))
linePlot <- plot + geom_line(aes(group=1), colour="blue", size=0.5)
print(linePlot)
}
3)main函数,它声明所有库并将excel工作簿作为数据框读取。
在主要功能中,我试图使用&#34; if else&#34;来调用不同的绘图函数。如下:
main <- function() {
library(XLConnect)
library(ggplot2)
wk <- loadWorkbook("D:\\....xlsx")
dataFrame = readWorksheet (wk, sheet="sheet1", header=TRUE)
df <- data.frame(Dates = dataFrame[,1],
Values =dataFrame[,2])
name <- scan(what = " ")
if (name == "bar")
{ bar() }
else if (name == "line")
{ line() }
}
但它会抛出错误:&#34; ggplot2不知道如何处理类函数的数据&#34;。
数据的简化版本:
Dates Values
Jan 46
Feb 54
Mar 32
如何修改我的代码以满足根据用户输入绘制不同图形的要求?
答案 0 :(得分:0)
您的问题与variable scope有关:main()
中定义的数据框仅在main()
内可用。即使从 bar()
内调用它们,line()
或main()
,等其他功能也无法看到它。
首选解决方案是传递函数显式需要的所有数据。因此,将您的功能定义为:
bar <- function(df) {
plot <- ggplot (data= df, aes(x= Dates, y= Values))
barPlot <- plot + geom_bar(stat="identity", fill="red", width=1)
print(barPlot)
}
并从main()
调用它,如下所示:
main <- function() {
library(ggplot2)
df <- data.frame(Dates = c("Jan", "Feb", "Mar"),
Values =c(46, 54, 52))
name <- scan(what = " ")
if (name == "bar")
{ bar(df) }
}
还有其他方法可以解决这个问题,我会提到它的完整性,尽管它们并不像上面那样好。首先,您可以嵌套函数定义,例如:
main <- function(){
bar <- function(){
...
}
...
bar()
}
这是有效的,因为在其他函数内定义的函数可以访问该函数中定义的所有变量。
最后,所有函数都可以访问全局变量,因此您可以在main()
之外定义变量,也可以使用<<-
运算符将它们定义为全局变量。
答案 1 :(得分:0)
似乎ggplot2
包无法处理类型函数的数据。您可以传递整个函数体,而不是在main()
中调用函数名称。
main <- function() {
...
...
name <- scan(what = " ")
if (name == "bar")
{ plot <- ggplot (data= df, aes(x= Dates, y= Values))
barPlot <- plot + geom_bar(stat="identity", fill="red", width=1)
print(barPlot)
}
}
这会在提供main()
作为输入时调用bar
时显示图表。