2016-12-08 68 views
0

是否有一種方式來顯示從textInput()在UI別處的價值,而不必經過server.R的東西非常冗長像下面?收集所有用戶輸入整個閃亮應用

ui.R

library(shiny) 
shinyUI(
    fluidPage(
    textInput('text_in', label = 'Write text here'), 

    # elsewhere in the UI... 

    textOutput('text_out') 
)) 

server.R

library(shiny) 
shinyServer(function(input, output) { 
    output$text_out = renderText(input$text_in) 
}) 

這不是太糟糕了這個例子,但它變得非常冗長,當我需要做很多次。我的願望是收集用戶在整個應用程序中輸入的所有輸入內容,並在最後將它們編譯爲一張漂亮的表格,以便他們確認所有內容均已正確佈置。

我見過在conditionalPanel()中使用JavaScript表達式時,您可以在不通過服務器的情況下引用輸入元素,但我不確定如何在此特定實例之外實現該功能。

回答

1

由於您的總體目標是收集所有的用戶輸入,然後將它們彙編成一個表格,我會告訴你如何做到這一點與下面的例子。正如你可以看到所有的input變量可以通過名稱從server進行訪問。爲了進一步分析或某些renderUI功能,我將它們保存在反應中。

#rm(list=ls()) 
library(shiny) 

ui <- basicPage(
    textInput('a', 'Text A',"a1"), 
    textInput('b', 'Text B',"b1"), 
    textInput('c', 'Text A',"c1"), 
    textInput('d', 'Text B',"d1"), 
    textInput('e', 'Text A',"e1"), 
    textInput('f', 'Text B',"f1"), 
    tableOutput('show_inputs') 
) 
server <- shinyServer(function(input, output, session){ 

    AllInputs <- reactive({ 
    myvalues <- NULL 
    for(i in 1:length(names(input))){ 
     myvalues <- as.data.frame(rbind(myvalues,(cbind(names(input)[i],input[[names(input)[i]]])))) 
    } 
    names(myvalues) <- c("User Input","Last Value") 
    myvalues 
    }) 

    output$show_inputs <- renderTable({ 
    AllInputs() 
    }) 
}) 
shinyApp(ui = ui, server = server) 

enter image description here

5

訪問所有輸入,您可以使用reactiveValuesToList服務器端。您可以通過JavaScript事件訪問輸入值象下面這樣(我已經採取了從@Pork印章爲例):

library(shiny) 

ui <- basicPage(

    fluidRow(
    column(
     width = 6, 
     textInput('a', 'Text A',"a1"), 
     textInput('b', 'Text B',"b1"), 
     textInput('c', 'Text A',"c1"), 
     textInput('d', 'Text B',"d1"), 
     textInput('e', 'Text A',"e1"), 
     textInput('f', 'Text B',"f1") 
    ), 
    column(
     width = 6, 
     tags$p("Text A :", tags$span(id = "valueA", "")), 
     tags$script(
     "$(document).on('shiny:inputchanged', function(event) { 
      if (event.name === 'a') { 
      $('#valueA').text(event.value); 
      } 
     }); 
     " 
    ), 
     tableOutput('show_inputs') 
    ) 
) 
) 

server <- shinyServer(function(input, output, session){ 

    AllInputs <- reactive({ 
    x <- reactiveValuesToList(input) 
    data.frame(
     names = names(x), 
     values = unlist(x, use.names = FALSE) 
    ) 
    }) 

    output$show_inputs <- renderTable({ 
    AllInputs() 
    }) 
}) 
shinyApp(ui = ui, server = server)