1

csvファイル入力のさまざまなグラフを出力するRプログラムを設計しています。私は Rstudio Shiny と ggPlot2 (そしておそらく後で D3!) を使用してプログラムを開発しています。ただし、これらの言語は初めてなので、いくつかの大きな問題に直面しています。これまでの私のプログラムは次のとおりです。

2 日前の私からの関連記事: How to Specify Columns when a user choose a file to upload in 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))

  })
})

ui.R

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() を実行しようとすると、平滑化も表示されません。

もう 1 つの問題は、グラフがデータを順番に表示していないことです (たとえば、私が渡したデータセットでは、月は 6 月、7 月、8 月の順に並んでいますが、グラフではごちゃ混ぜになっています)。

助けてくれてありがとう。

実行できない場合に備えて、プログラムがどのように見えるかの写真を添付し​​ました。

サンプル画像

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: もう 1 つの問題は、グラフがデータを順番に表示していないことです (たとえば、私が渡したデータセットでは、月は 6 月、7 月、8 月の順に並んでいますが、グラフではごちゃごちゃになっています)。

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

  })
})

UI.R

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 に答える