2016-06-01 9 views
1

Ich bin neu bei shinyapps und versuche, eine einfache App zu erstellen, die ein .csv mit vier Spalten öffnen kann. Nach dem Öffnen kann der Benutzer drei Spalten auswählen, um a) Punkte und b) Bereiche über und unter den jeweiligen Punkten zu zeichnen - siehe erstes Bild unten. Allerdings weiß ich an dieser Stelle nicht, wie ich meine Punktdaten in der Handlung referenzieren soll. Ich bekomme Error: attempt to select less than one element in get1index. - siehe zweites Bild unten. n Ich habe am Ende des Textes eine CSV-Datei mit 5 Zeilen eingefügt. Wunsch Ausgabe:R shinyapp - So öffnen und zeichnen von csv. Getting Error: Versuche, weniger als ein Element in get1index auszuwählen

enter image description here

New Error Keine, gelöst.

UPDATE: Code unten funktioniert jetzt - siehe Kommentare

# Set wd 
#setwd("C:/Data/SCRIPTS/R/Uncertainty/MCSims/simsShinyApp") 

# Set libraries 
library(shiny) 
library(rriskDistributions) 
library(ggplot2) 
library(dplyr) 

ui <- 
     shinyUI(fluidPage(tabsetPanel(
       tabPanel("Group Data", " ", 
         fluidRow(
           titlePanel(h2("Group Guesses"), br()), 

           column(width = 2, 
             " ", 
             fileInput('datafile', 'Choose CSV file', 
                accept=c('text/csv', 'text/comma-separated-values,text/plain')), 
             uiOutput("selectcol1"), 
             uiOutput("selectcol2"), 
             uiOutput("selectcol3"), 
             uiOutput("selectcol4") 
           ), 

           column(width = 3, 
             " ", 
             dataTableOutput('filedata')), 
           column(width = 7, 
             " ", 
             plotOutput("plot6", height = "600px")) 
         )) 
     ))) 

server <- function(input, output) { 
     filedata <- reactive({ 
       infile <- input$datafile 
       if (is.null(infile)) { 
         # User has not uploaded a file yet 
         return(NULL) 
       } 
       read.csv(infile$datapath) 
     }) 

     # filedata() <- filedata()[order(filedata()[[input$selectcol1]]] 


     x <- reactive({ 
       1:dim(filedata())[1] 
     }) 

     output$selectcol1 <- renderUI({ 
       df <-filedata() 
       if (is.null(df)) return(NULL) 

       items=names(df) 
       names(items)=items 
       selectInput("selectcol1", "Best Estimate",items) 

     }) 

     output$selectcol2 <- renderUI({ 
       df <-filedata() 
       if (is.null(df)) return(NULL) 

       items=names(df) 
       names(items)=items 
       selectInput("selectcol2", "Lower Bound",items) 
     }) 

     output$selectcol3 <- renderUI({ 
       df <-filedata() 
       if (is.null(df)) return(NULL) 

       items=colnames(df) 
       names(items)=items 
       selectInput("selectcol3", "Upper Bound:",items) 

     }) 

     output$selectcol4 <- renderUI({ 
      df <-filedata() 
      if (is.null(df)) return(NULL) 

      items=colnames(df) 
      names(items)=items 
      selectInput("selectcol4", "Source:",items) 

     }) 

     output$filedata = renderDataTable({ 
       filedata() 

     }) 
     output$plot6 <- renderPlot({ 
       plot(
         x(), 
         filedata()[[input$selectcol1]], 
         log = "y", 
         ylim = range(c(min(
          filedata()[[input$selectcol2]] 
         ), max(
          filedata()[[input$selectcol3]] 
         ))), 
         pch = 18, 
         xlab = "Guess", 
         ylab = "Value", 
         main = "Scatter plot with 90% confidence intervals", 
         col = filedata()[[input$selectcol4]] 
       ) 
       # hack: we draw arrows but with very special "arrowheads" 
       arrows(
         x(), 
         filedata()[[input$selectcol2]], 
         x(), 
         filedata()[[input$selectcol3]], 
         length = 0.05, 
         angle = 90, 
         code = 3 
       ) 
       abline(h = 951, col = "green") 
       abline(h = ave(filedata()[[input$selectcol1]]), col = "red") 
     }) 
} 

shinyApp(ui = ui, server = server) 

file.csv

Best,Lb,Up,Source 
5,3,10,Bill 
6,2,8,Tom 
6,3,11,Bill 
4,1,12,Tom 
+1

Es ist eine schlechte Übung einige Objekte mit einer ID zu haben (meine Meinung) - 'uiOutput (" col1 ")' und 'selectInput (" col1 ", ...)'. Versuchen Sie, ids zu ändern und 'input $ selectcol1' instate von' output $ col1' zu verwenden, wo 'selectcol1' - das ist Ihre neue ID für' selectInput ("col1", ..) '(soo für jede Eingabe) – Batanichek

+0

@Batanichek: Vielen Dank. Könntest du mir ein Beispiel geben? Ich habe den Code mit deinen Kommentaren aktualisiert, aber es tut mir immer noch schwer. Der neue Fehler besteht darin, dass sich die Längen x und y unterscheiden. – val

+1

Es ist schwer, ein Beispiel ohne Daten zu machen. Aber jetzt Problem hier: Eingabe $ selectcol1- sein Zeichen nicht die Spalte Ihrer Daten. Versuchen Sie 'plot ( x(), filedata() [[input $ selectcol1]], ...' (mit all Ihrer Eingabe $ selectcol1) – Batanichek

Antwort

1

sammeln alle meine commets

1) Sie müssen zu beantworten verstehen Unterschiede zwischen input und output Hier müssen Sie input$ids in Plot für ausgewählte Daten verwenden. Bessere

2) für jedes Element unterschiedliche ID setzen uiOutput("col1") und selectInput("col1",..) gleiche haben id

3) input$selectcol1 Rückkehr character Vektor, also wenn Sie Spalte mit dem Namen == zu bekommen input$selectcol1 Sie brauchen filedata()[[input$selectcol1]]