2017-02-10 7 views
0

My Shiny Appには、使用する変数の数に応じた複数の入力があります。単純化されたバージョンは動作しませんが、下記のとおりです。 uiOutputを作成するために使用したMake.UIという関数を使用してnumericInputに基づいてUIを更新することができましたが、入力をサーバーに戻すことはShinyスキルセットを超えています!どんな提案も大歓迎です。複数の入力を持つシャイニーなrenderUI

グウィン

library(shiny) 
D = matrix(runif(400), nrow = 20) 
colnames(D) = labs = sapply(1:20, function(i) {paste0("col",i)}) 

# Define UI for application that summarises data 
ui <- fluidPage(

    # Application title 
    titlePanel("Summaries"), 

    # Select columns to get fed into summary 
    tabsetPanel(
    tabPanel("Matching Variables Info", 
      sidebarPanel(

       numericInput("NoVars","No. of variables to summarize", 
          value = 3, min = 2, max = dim(D)[2]), 

       uiOutput("VarsInput") 
      ), 

      # Show summaries of columns choosen above 
      mainPanel(
       verbatimTextOutput("dataInfo") 
      ) 
    ) 
) 
) 


# Define the server code 
server <- function(input, output){ 

    Make.UI <- function(NoV){ 
    C = sapply(1:NoV, function(i){paste0("cols",i)}) 
    L = sapply(1:NoV, function(i){paste0("label",i)}) 

    output = tagList() 

    for(i in seq_along(1:NoV)){ 
     output[[i]] = tagList() 
     output[[i]][[1]] = selectInput(C[i], "Variable to summarize:", labs) 
     output[[i]][[2]] = textInput(L[i], label = "Label for variable:", 
            value = "Label for variable Here") 
    } ## for loop 

    output 
    } # closes Make.UI function 

    K <- reactive({ 
    input$NoVars 
    }) 

    output$VarsInput <- renderUI({ 
    Make.UI(K()) 
    }) 

    output$dataInfo <- renderPrint({ 
    C <- sapply(1:K(), function(i) {input[[paste0("cols",i)]]}) 
    ## the code in the line above doesn't work 

    summary(D[, C()]) 
    }) 

} 

# Return a Shiny app object 
shinyApp(ui = ui, server = server) 
+0

サーバ機能の外で 'Make.UI()'を定義できますか?利用可能な出力変数はありませんか?それには光沢のあるモジュールを使用する必要があります。さらに、renderUIから複数の入力を返す場合は、 'tagList()'を使うべきです。 renderUIで生成された入力を使用する方法についての最後の質問は、サーバー内でidを割り当てるだけです。あなたが上記の発言を考慮に入れるとすぐに働かなければならない。 – BigDataScientist

+0

@BigDataScientist前にtagList()を使ったことはありません。あなたはこれに似た例を知っていますか?私は前にShinyでグローバルに定義された関数を使用しましたが、問題はありませんでしたが、おそらくこれは異なっています。 – nzgwynn

+0

ああ、あなたの出力は光沢のある出力ではありませんが、自分で定義すると、少し疲れているようです。さて、私は代わりに 'output = tagList()'を使用しようとします。ところで、コードは完全に再現できません。なぜなら、 'l.cols'は何を提供していないからです。したがって、私はより一般的な方法で答えます。とにかくそれが助けてくれることを願います – BigDataScientist

答えて

2

私が最初のコメントに書いたように、私はMake.UI()機能について不明な点です。あなたが本当に別の機能としてそれを保持したいなら、それを反応させるべきです。または、以下のコードで行ったように使用してください。 さらに、output$dataInfo <- renderPrint({では、Cはreactive()関数ではないので、そこで角括弧を削除する必要があります。

library(shiny) 
D = matrix(runif(400), nrow = 20) 
colnames(D) = labs = sapply(1:20, function(i) {paste0("col",i)}) 

# Define UI for application that summarises data 
ui <- fluidPage(

    # Application title 
    titlePanel("Summaries"), 

    # Select columns to get fed into summary 
    tabsetPanel(
    tabPanel("Matching Variables Info", 
      sidebarPanel(

       numericInput("NoVars","No. of variables to summarize", 
          value = 3, min = 2, max = dim(D)[2]), 

       uiOutput("VarsInput") 
      ), 

      # Show summaries of columns choosen above 
      mainPanel(
       verbatimTextOutput("dataInfo") 
      ) 
    ) 
) 
) 


# Define the server code 
server <- function(input, output){ 

    K <- reactive({ 
    input$NoVars 
    }) 

    output$VarsInput <- renderUI({ 
    NoV = K() 
    C = sapply(1:NoV, function(i){paste0("cols",i)}) 
    L = sapply(1:NoV, function(i){paste0("label",i)}) 

    output = tagList() 

    for(i in seq_along(1:NoV)){ 
     output[[i]] = tagList() 
     output[[i]][[1]] = selectInput(C[i], "Variable to summarize:", labs) 
     output[[i]][[2]] = textInput(L[i], label = "Label for variable:", 
            value = "Label for variable Here") 
    } ## for loop 

    output 
    }) 

    output$dataInfo <- renderPrint({ 
    C <- sapply(1:K(), function(i) {input[[paste0("cols",i)]]}) 
    ## the code in the line above doesn't work 

    summary(D[, C]) 
    }) 

} 

# Return a Shiny app object 
shinyApp(ui = ui, server = server) 
+0

ありがとう!それは完全にあなたの最初のコメントを完全に理解していないことを申し訳なく思っています。 – nzgwynn

+1

私はどのように考え出した!申し訳ありません、私は知らなかった! – nzgwynn

+0

私は通常、答えや解決策についてはコメントしませんが、これは非常に印象的です。私は@BigDataScientistに多くの信用を与える価値があると思います。 –

関連する問題