1

我正在设计一个 R 程序来输出任何 csv 文件输入的不同图形。我正在使用 Rstudio Shiny 和 ggPlot2(也许是以后的 D3!)来开发程序。然而,作为这些语言的新手,我遇到了一些主要问题。到目前为止,这是我的程序:

我 2 天前的相关帖子:当用户选择要在 R 中上传的文件时如何指定列?

服务器.R

library(shiny)
library(datasets)
library(ggplot2)

X <- read.csv(file.choose())


# Define server logic required to summarize and view the selected dataset
shinyServer(function(input, output) {


  # Generate a summary of the dataset
  output$summary <- renderPrint({
    dataset <- X
    summary(dataset)
  })

  # Show the first "n" observations
  output$view <- renderTable({
    head(X, n = input$obs)
  })

  createPlot <- function(df, colx, coly) {
    ggplot(data=df, aes(x=df[,colx],y=df[,coly]), environment = environment()) + geom_point(size = 3) + geom_line() 
  }

  Y <- reactive({
    X
  })


  # create a basic plot
  output$plotBasic <- reactivePlot(function() {
    df <- Y()
    print(createPlot(df, colx=input$xa, coly=input$ya))

  })
})

用户界面

library(shiny)

# Define UI for dataset viewer application
shinyUI(pageWithSidebar(

  # Application title
  headerPanel("My app!"),

  # Sidebar with controls to select a dataset and specify the number
  # of observations to view
  sidebarPanel(
    numericInput("obs", "Number of observations to view:", 13),
    numericInput("xa", "Column to plot as X-axis:", 1),
    numericInput("ya", "Column to plot as Y-axis:", 2)

  ),

  # Show a summary of the dataset and an HTML table with the requested
  # number of observations
  mainPanel(
    tabsetPanel(
      tabPanel("Table", tableOutput("view")),
      tabPanel("BasicGraph", plotOutput("plotBasic"))
    )
  )
))

我的程序有一些问题。我不知道如何在图表上读取的 csv 数据中显示列名(上传的文件可以是任何内容)。此外,每当我尝试更改图形显示(ggplot 函数中的 geom)时,它都不会更改图形。在这里我添加了“geom_line()”,但它只显示点。如果我尝试执行 stat_smooth() 它也不会显示平滑。

另一个问题是图表没有按顺序显示数据(例如,在我传入的数据集中,月份是有序的,六月,七月,八月,但在图表中它们是混乱的)。

谢谢你们的帮助。

我附上了程序的图片,以防您无法运行它。

样本图片

http://i.imgur.com/Agrw8EE.png

4

1 回答 1

2

有多个问题需要解决。

Q1:我不知道如何在图表上读取的csv数据中显示列名(上传的文件可以是任何东西)。

您可以通过将 UI 设置为“动态”来做到这一点。http://rstudio.github.io/shiny/tutorial/#dynamic-ui

在 UI.R添加

uiOutput("opt.x"), #dynamic UI
uiOutput("opt.y") #value comes from Server.R    

在 Server.R 中添加

 output$opt.x <- renderUI({
    selectInput("xcolumn", "X column to Plot",
                names(Y()) 
                )
  })

  output$opt.y <- renderUI({
    selectInput("ycolumn", "Y Column",
                names(Y()))
  })

Q2:此外,每当我尝试更改图形显示(ggplot 函数中的 geom)时,它都不会更改图形。在这里我添加了“geom_line()”,但它只显示点。

最有可能的是,您应该收到来自ggplotre 的警告消息。分组。您可以通过显式指定group参数来解决这个问题。

p <- p + geom_line(aes(group=colx)) 

Q3:另外一个问题是图表没有按顺序显示数据(比如我传入的数据集中,月份是有序的,六月,七月,八月,但是在图表中它们是杂乱无章的)。

Ggplot 正在对日期进行内部排序。关于 SO 有几个问题可以解决不同的重新排序方式。(ggplot2:排序一个情节

总体这是我的 UI.R 和 Server.R 的工作版本

服务器.R

library(shiny)
library(datasets)
library(ggplot2)

X <- read.csv(file.choose())
# Define server logic required to summarize and view the selected dataset
shinyServer(function(input, output) {
  output$opt.x <- renderUI({
    selectInput("xcolumn", "X column to Plot",
                names(Y()) 
                )
  })

  output$opt.y <- renderUI({
    selectInput("ycolumn", "Y Column",
                names(Y()))
  })

  # Generate a summary of the dataset
  output$summary <- renderPrint({
    dataset <- X
    summary(dataset)
  })

  # Show the first "n" observations
  output$view <- renderTable({
    head(X, n = input$obs)
  })

  createPlot <- function(df, colx, coly) {
    p <- ggplot(data=df, aes(x=df[,colx],y=df[,coly]), environment = environment()) #+ geom_line(aes(x=df[,colx],y=df[,coly], group=colx))
    p <- p + geom_line(aes(group=colx)) 
    p <- p + xlab(names(df)[colx]) + ylab(names(df)[coly]) 
  }

  Y <- reactive({
    X
      })



  # create a basic plot
  output$plotBasic <- reactivePlot(function() {
    df <- Y()
    print(createPlot(df, colx=input$xcolumn, coly=input$ycolumn))

  })
})

用户界面

library(shiny)

# Define UI for dataset viewer application
shinyUI(pageWithSidebar(
  # Application title
  headerPanel("My app!"),

  # Sidebar with controls to select a dataset and specify the number
  # of observations to view
  sidebarPanel(
    numericInput("obs", "Number of observations to view:", 13),
    uiOutput("opt.x"), #dynamic UI
    uiOutput("opt.y") #value comes from Server.R    
    ),

  # Show a summary of the dataset and an HTML table with the requested
  # number of observations
  mainPanel(
    tabsetPanel(
      tabPanel("Table", tableOutput("view")),
      tabPanel("BasicGraph", plotOutput("plotBasic"))
    )
  )
))

希望有帮助。

于 2013-07-25T20:24:40.637 回答