如何在使用ggplot包时使用R中函数名的字符串调用函数?

时间:2015-05-14 15:34:00

标签: r ggplot2

我一直在尝试编写一个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

如何修改我的代码以满足根据用户输入绘制不同图形的要求?

2 个答案:

答案 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时显示图表。