2016-04-30 46 views
2

我是R-shiny应用程序的新手,我的应用程序非常简单。它有两个选项卡,第一,我上传一个文件,如csv,然后在第二个选项卡,我选择将被绘制的列,我的解决方案分散在几个例子,每个不同于我的,我想上传的数据集可以被看到,并且可以在所有功能中使用,而不仅仅是在上传时。如何绘制使用闪亮上传的数据集?

我server.R

library(shiny) 
shinyServer(function(input, output) { 
output$contents <- renderTable({ 
inFile <- input$file1 

if (is.null(inFile)) 
    return(NULL) 
read.csv(inFile$datapath, header=input$header, sep=input$sep, 
     quote=input$quote) 

}) 
output$MyPlot <- renderPlot({ 
x <- contents()$contents[, c(input$xcol, input$ycol)] 
bins <- nrow(contents()) 
hist(x, breaks = bins, col = 'darkgray', border = 'white') 
}) 
}) 

ui.R

library(shiny) 
library(datasets) 
shinyUI(fluidPage(
titlePanel("Column Plot"), 
tabsetPanel(
tabPanel("Upload File", 
     titlePanel("Uploading Files"), 
     sidebarLayout(
      sidebarPanel(
      fileInput('file1', 'Choose CSV File', 
         accept=c('text/csv', 
           'text/comma-separated-values,text/plain', 
           '.csv')) 

    ), 
      mainPanel(
      tableOutput('contents') 
      ) 
     ) 
), 
tabPanel("First Type", 
     pageWithSidebar(
      headerPanel('My First Plot'), 
      sidebarPanel(
      selectInput('xcol', 'X Variable', names(content)), 
      selectInput('ycol', 'Y Variable', names(content), 
         selected=names(content)[[2]]) 
      ), 
      mainPanel(
      plotOutput('MyPlot') 
      ) 
     ) 
) 

) 
) 
) 

我一直在努力,这一点,但我刚开始是这样,我该怎么办吗?

+0

为了获得帮助,我建议您提供一个.csv文件,以便在您的闪亮应用中使用。 – aelwan

回答

4

您可以创建一个被动数据集(例如data),其中您的应用程序将读取上传的文件并更新输入 - 在本例中为数据框的名称并将其传递给render*函数。我在代码中做了一些更详细的评论。

library(shiny) 
library(datasets) 

ui <- shinyUI(fluidPage(
    titlePanel("Column Plot"), 
    tabsetPanel(
    tabPanel("Upload File", 
      titlePanel("Uploading Files"), 
      sidebarLayout(
       sidebarPanel(
       fileInput('file1', 'Choose CSV File', 
          accept=c('text/csv', 
            'text/comma-separated-values,text/plain', 
            '.csv')), 

       # added interface for uploading data from 
       # http://shiny.rstudio.com/gallery/file-upload.html 
       tags$br(), 
       checkboxInput('header', 'Header', TRUE), 
       radioButtons('sep', 'Separator', 
           c(Comma=',', 
           Semicolon=';', 
           Tab='\t'), 
           ','), 
       radioButtons('quote', 'Quote', 
           c(None='', 
           'Double Quote'='"', 
           'Single Quote'="'"), 
           '"') 

       ), 
       mainPanel(
       tableOutput('contents') 
       ) 
      ) 
    ), 
    tabPanel("First Type", 
      pageWithSidebar(
       headerPanel('My First Plot'), 
       sidebarPanel(

       # "Empty inputs" - they will be updated after the data is uploaded 
       selectInput('xcol', 'X Variable', ""), 
       selectInput('ycol', 'Y Variable', "", selected = "") 

       ), 
       mainPanel(
       plotOutput('MyPlot') 
       ) 
      ) 
    ) 

) 
) 
) 

server <- shinyServer(function(input, output, session) { 
    # added "session" because updateSelectInput requires it 


    data <- reactive({ 
    req(input$file1) ## ?req # require that the input is available 

    inFile <- input$file1 

    # tested with a following dataset: write.csv(mtcars, "mtcars.csv") 
    # and        write.csv(iris, "iris.csv") 
    df <- read.csv(inFile$datapath, header = input$header, sep = input$sep, 
      quote = input$quote) 


    # Update inputs (you could create an observer with both updateSel...) 
    # You can also constraint your choices. If you wanted select only numeric 
    # variables you could set "choices = sapply(df, is.numeric)" 
    # It depends on what do you want to do later on. 

    updateSelectInput(session, inputId = 'xcol', label = 'X Variable', 
         choices = names(df), selected = names(df)) 
    updateSelectInput(session, inputId = 'ycol', label = 'Y Variable', 
         choices = names(df), selected = names(df)[2]) 

    return(df) 
    }) 

    output$contents <- renderTable({ 
     data() 
    }) 

    output$MyPlot <- renderPlot({ 
    # for a histogram: remove the second variable (it has to be numeric as well): 
    # x <- data()[, c(input$xcol, input$ycol)] 
    # bins <- nrow(data()) 
    # hist(x, breaks = bins, col = 'darkgray', border = 'white') 

    # Correct way: 
    # x <- data()[, input$xcol] 
    # bins <- nrow(data()) 
    # hist(x, breaks = bins, col = 'darkgray', border = 'white') 


    # I Since you have two inputs I decided to make a scatterplot 
    x <- data()[, c(input$xcol, input$ycol)] 
    plot(x) 

    }) 
}) 

shinyApp(ui, server) 
+1

输入受限于数字变量:'updateSelectInput(session,inputId ='xcol',label ='X Variable', choices = names(df),selected = names(df)[sapply(df,is.numeric)]) ' –

+0

惊人的答案! –