2017-05-11 24 views
0

Ich möchte, dass der App-Benutzer etwas aus der Dropdown-Liste auswählt und dann einen numerischen Wert dafür eingibt, der in einen Datenrahmen übersetzt würde. Wenn dasselbe Element beim n-maligen Klicken auf die Schaltfläche ausgewählt wird, ersetzt es den ursprünglichen Wert. Andernfalls sollte es die neuen Werte in den Datenrahmen einschließen. Ich weiß nicht, warum es auch einen seltsamen Header auf meinem Datenrahmen gibt. Bitte beraten, danke.Bedingtes Cbind für Datenframe in R Shiny

ui <- fluidPage(
    selectInput("solvent", "Choose a solvent:", 
       list(`Solvent` = c("ETOH", "SALINE", "DW5",'CREMOPHOR','WATER','DMSO','2% KLUCEL (pH=4 /w HCl)') 
    )), 
    numericInput('vol','Vol solvent (ml)',0), 
    actionButton('add','Add'), 
    textOutput("result"), 
    tableOutput('table') 
) 
    server = function(input, output) { 

    rv <- reactiveValues() 
     observeEvent(input$add,{rv$data<-data.frame(c(input$solvent,input$vol)); setNames(rv$data,input$solvent); 
     if (as.numeric(input$add)>1 & colnames(rv$data) == input$solvent) 
     {rv$data[1,input$solvent] = input$vol} 
     else {cbind(rv$data,data.frame(input$solvent,input$vol))} 
     }) 
    output$table<-renderTable({ rv$data}) 

    output$result <- renderText({ 
     paste("You chose", input$solvent) 
    }) 
    } 

shinyApp(ui, server) 

enter image description here

+0

Namen (Datenrahmen) <- NULL – Ars

Antwort

1

eine leere Datenrahmen Füllung und der Werte zu überschreiben erfordert leider etwas mehr als ein zwei-liner. Ich schlage vor, die folgenden:

ui <- fluidPage(
    selectInput("solvent", "Choose a solvent:", 
       list(`Solvent` = c("ETOH", "SALINE", "DW5",'CREMOPHOR','WATER','DMSO','2% KLUCEL (pH=4 /w HCl)') 
      )), 
    numericInput('vol','Vol solvent (ml)',0), 
    actionButton('add','Add'), 
    textOutput("result"), 
    tableOutput('table') 
) 
server = function(input, output) { 

    rv <- reactiveValues() 

    observeEvent(input$add, { 
    if(is.null(rv$data)){ 
     rv$data <- data.frame(input$vol) 
     names(rv$data) <- input$solvent 
    } 
    rv$data[input$solvent] <- input$vol 
    }) 

    output$table<-renderTable({ rv$data}) 

    output$result <- renderText({ 
    paste("You chose", input$solvent) 
    }) 
} 

shinyApp(ui, server) 
+0

fantastisch, danke für die Hilfe:

rv <- reactiveValues() observeEvent(input$add, { if(is.null(rv$data)){ rv$data <- data.frame(input$vol) names(rv$data) <- input$solvent } rv$data[input$solvent] <- input$vol }) 

Die Vollversion finden Sie unten! –