【问题标题】:How to call functions using the character string of the function name in R while using the ggplot package?使用ggplot包时如何使用R中函数名的字符串调用函数?
【发布时间】:2015-05-14 15:33:59
【问题描述】:

我一直在尝试编写一个 R 代码,它可以使用 ggplot 包从 excel 文件中读取数据并根据用户输入绘制不同的图表(如:条形图、折线图、点图或饼图)。

为此,我使用了 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工作簿作为数据框读取。

在主函数中,我尝试使用“if else”调用不同的绘图函数,如下所示:

    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() }
}

但它会抛出错误:“ggplot2 不知道如何处理类函数的数据”。

数据的简化版本:

Dates Values
Jan   46
Feb   54
Mar   32

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

【问题讨论】:

  • 查看这些:stackoverflow.com/help/how-to-askstackoverflow.com/questions/5963269/…。另请注意,您的代码在一处使用barPlot,在另一处使用barplot
  • 您是否在bar() 函数中定义了datadata 恰好是一个基本的 R 函数。请创建一个完整的、最小的reproducible example 以充分说明您的观点。
  • 我认为问题可能是您的代码中的拼写错误 - 您定义了变量 barPlot 但尝试打印 barplot(小写 p)。此外,正如@MrFlick 指出的那样,您不应该使用像dataplotbarplot 这样的变量名,因为它们会与基本的r 函数冲突。进行这些更改,我认为这应该可以正常工作。
  • 我无法重现您的错误。这向我表明问题可能出在您的数据上,而您仍未提供这些数据。请使用您的数据的简化版本进行编辑(例如,dput(head(data)) 的输出仍然会导致问题。
  • 请让你的例子 minimal 。从输入数据框开始,去掉scan、Excel、未使用的包、特定于您的系统的文件和目录等。如果DF是您的输入数据框,那么您可以使用@987654341重复显示它@

标签: r ggplot2


【解决方案1】:

您的问题与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() 之外定义变量,也可以使用 &lt;&lt;- 运算符将它们定义为全局变量。

【讨论】:

  • 我尝试了您首先提到的解决方案。但是在从 main 调用 bar(df) 时,它只是读取该项目。它没有绘制任何图表!?
  • @Code007- 您是否还重新定义了bar 函数,以便将df 作为参数?这段代码非常适合我使用您的 main 函数 - 我所做的唯一更改是根据您的简化数据直接在函数开头定义 df
  • 是的,我重新定义了bar 函数。但它只在控制台上显示:Read 1 item。没有图表输出。
  • 你能分享你的图表吗,条形图和线形图?
  • @Code007 我已经添加了对我有用的完整代码。如果这对您有用,那么问题出在用于简化或读取数据的步骤中。如果没有,那么我不知道问题可能是什么。无论哪种方式,我们已经远远超出了我们应该在这里遵循的问答形式......
【解决方案2】:

似乎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)
    }
}

这会在以 bar 作为输入时调用 main() 时显示图表。

【讨论】:

    猜你喜欢
    • 2011-09-18
    • 2018-07-21
    • 2017-09-29
    • 1970-01-01
    • 2018-08-22
    • 1970-01-01
    • 1970-01-01
    • 2016-06-02
    • 1970-01-01
    相关资源
    最近更新 更多