收集整个Shiny App中的所有用户输入

Cep*_*irk 6 r shiny

有没有办法从textInput()UI中的其他地方显示价值,而不必server.R像下面那样经历一些非常冗长的东西?

ui.R

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

  # elsewhere in the UI...

  textOutput('text_out')
))
Run Code Online (Sandbox Code Playgroud)

server.R

library(shiny)
shinyServer(function(input, output) {
  output$text_out = renderText(input$text_in)
})
Run Code Online (Sandbox Code Playgroud)

对于这个例子来说并不是太糟糕,但是当我需要多次这样做时它会变得非常冗长.我的愿望是收集用户在整个应用程序中输入的所有输入,并在最后将它们编译成一个漂亮的表格,以便他们可以确认所有内容都是正确的.

我已经看到你在使用JavaScript表达式时可以引用输入元素而无需通过服务器conditionalPanel()但是我不确定如何在这个特定实例之外实现它.

Vic*_*orp 13

要访问所有输入,您可以使用reactiveValuesToList服务器端.您可以通过下面的Javascript事件访问输入值(我从@Pork Chop中获取了示例):

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)
Run Code Online (Sandbox Code Playgroud)


Por*_*hop 6

由于您的总体目标是收集所有用户输入,然后将它们编译成表格,因此我将通过下面的示例向您展示如何实现这一目标。如您所见,所有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)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明