2017-02-10 174 views
0

My Shiny App有多個輸入,取決於所使用的變量數量。下面是一個簡化版本,雖然不起作用。我能夠使用一個名爲Make.UI的函數來獲取UI,並根據numericInput進行更新,我使用它來創建uiOutput,但將輸入返回到服務器中超出了我的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生成的輸入的最終問題,僅僅是通過您在服務器內分配它們的標識。只要您將上述評論考慮在內,應該儘快開展工作。 – BigDataScientist

+0

@BigDataScientist我從來沒有使用過tagList()。你知道任何與此類似的例子嗎?我之前使用的是Shiny中全局定義的函數,沒有任何問題,但也許這是不同的。 – nzgwynn

+0

啊我看到了,你的'輸出'不是閃亮的輸出,但你自己定義它,好像我有點累。那麼我會嘗試使用'output = tagList()'來代替。順便說一下,代碼不是完全可重複的,因爲你沒有提供什麼'l.cols'is。因此,我用更通用的方式回答。無論如何希望它有幫助。 – 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值得信賴。 –