2016-12-08 38 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)