2016-12-08 5 views
0

textInput()の値をUIの別の場所に表示する方法は、server.Rを次のように非常に冗長にする必要はありませんか?Shiny Appを通じてすべてのユーザー入力を集める

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という名前でアクセスできます。さらなる分析や、ある程度の機能のために必要な場合に備えて、私はそれらを反応させておきました。すべての入力にアクセスするために

#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 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) 
関連する問題