2015-03-11 3 views
1

Я пишу приложение Shiny, чтобы создать строку, содержащую таблицу для каждой переменной в наборе данных. Количество переменных будет меняться от использования до использования, и в идеале приложение будет выводить столько строк и таблиц, сколько есть переменных. Мой текущий код создает правильное количество строк и текста, но повторяет данные таблицы для последней таблицы для всех строк. Я считаю, что хранение выходов таблицы в output[[tablename]] может оказаться не в нужном месте для создания отдельно хранимых таблиц. Следующим шагом будет добавить реактивный вход для фильтрации строк, показанных vardata$category.R Блестящее динамическое число таблиц

  • Что необходимо для правильного заполнения данных таблицы в каждой строке?
  • Что мне нужно сделать, чтобы затем фильтровать, какие строки показаны с помощью реактивного входа?

код здесь включает в себя пример данных:

library(shiny)  
variable <- c("Q17r01", "Q17r01", "Q17r01", "Q22r03", "Q22r03", "Q22r03", "Q15r01", "Q15r01", "Q15r01", "S03", "S03", "vAge", "vAge", "vAge", "vAge", "vAge", "vAge") 
    responses <- c("A_T", "B_M", "C_B", "A_T", "B_M", "C_B", "A_T", "B_M", "C_B", "Female", "Male", "13 - 17", "18 - 24", "25 - 34", "35 - 44", "45 - 54", "55+") 
    grp1 <- c(33, 39, 28, 27, 20, 53, 88, 7, 5, 51, 49, 27, 8, 33, 14, 16, 2) 
    grp2 <- c(42, 46, 12,41, 45, 13, 64, 32, 4, 44, 56, 9, 22, 39, 13, 12, 4) 
    xAgg <- c(32, 49, 19, 26, 48, 26, 51, 38, 11, 45, 55, 12, 16, 30, 17, 14, 11) 
    chartdata <- data.frame(variable,responses,grp1,grp2,xAgg,row.names=NULL) 

    profvars <- unique(variable) 
    varlabel <- c("Q17r01_I_am_overwhelmed_by_the_number_of_apps_available_for_download", "Q22r03_I_feel_overwhelmed_by_the_number_of_digital_communications_I_receive", 
        "Q15r01_When_I_receive_a_message_online_I_tend_to_respond_right_away", "S03_Please_indicate_your_gender", "vAge_Age_breakdown") 
    category <- c("a_Causes_of_Stress", "a_Causes_of_Stress", "a_Communication_Availability", "zz_Demo", "zz_Demo") 
    vardata <- data.frame(profvars,varlabel,category,row.names=NULL) 

    chartdatasplit <- split(chartdata, chartdata$variable) 


    server <- function(input, output) { 

    assigntables <- reactive({ 
     for (vars in profvars){ 
     local({ 
      var <- vars 
      tablename <- paste0("table.",var) 
      assign("tabledata",chartdatasplit[[var]],pos=1) 
      output[[tablename]] <- renderTable({tabledata}) ###appears this is only being done for last table 
     }) 
     } 
    }) 

     output$AllVars <- renderUI({ 
     ##for (i_var in 1:nrow(vardata)) { 
     assigntables() 
     return(apply(vardata,1,function(vars){ 
      fluidRow(column(12,offset=1, 
      tableOutput(paste("table.",vars['profvars'],sep=''))), 
      hr() 
     ) 
     })) 
     }) 
    } 

    ui <- navbarPage("Seg Run", 
        tabPanel("Summary", 
           uiOutput("AllVars") 
        ) 
    ) 

    shinyApp(ui = ui, server = server) 
+0

Существует потенциальное решение в [этот вопрос] (http://stackoverflow.com/questions/ 22842354/outputing-н-таблица-в-блестящего-где-п-зависит-на-данных). Не знаю, почему блестящий только принимает последнюю таблицу. Может быть ошибкой для пакета, см. [Блестящие проблемы] (https://github.com/rstudio/shiny/issues) – cdeterman

+0

Я смотрел этот поток и увижу, могу ли я применить одно и то же решение с помощью xxtable, спасибо – LTR

+0

, пожалуйста, также проверьте этот последний ответ: https://stackoverflow.com/questions/31686773/shiny-dynamic-number-of-output-elements-plots – Beasterfield

ответ

2

Здесь мы идем:

library(shiny) 
library(xtable) 

variable <- c("Q17r01", "Q17r01", "Q17r01", "Q22r03", "Q22r03", "Q22r03", "Q15r01", "Q15r01", "Q15r01", "S03", "S03", "vAge", "vAge", "vAge", "vAge", "vAge", "vAge") 
responses <- c("A_T", "B_M", "C_B", "A_T", "B_M", "C_B", "A_T", "B_M", "C_B", "Female", "Male", "13 - 17", "18 - 24", "25 - 34", "35 - 44", "45 - 54", "55+") 
grp1 <- c(33, 39, 28, 27, 20, 53, 88, 7, 5, 51, 49, 27, 8, 33, 14, 16, 2) 
grp2 <- c(42, 46, 12,41, 45, 13, 64, 32, 4, 44, 56, 9, 22, 39, 13, 12, 4) 
xAgg <- c(32, 49, 19, 26, 48, 26, 51, 38, 11, 45, 55, 12, 16, 30, 17, 14, 11) 
chartdata <- data.frame(variable,responses,grp1,grp2,xAgg,row.names=NULL) 

profvars <- unique(variable) 
varlabel <- c("Q17r01_I_am_overwhelmed_by_the_number_of_apps_available_for_download", "Q22r03_I_feel_overwhelmed_by_the_number_of_digital_communications_I_receive", 
       "Q15r01_When_I_receive_a_message_online_I_tend_to_respond_right_away", "S03_Please_indicate_your_gender", "vAge_Age_breakdown") 
category <- c("a_Causes_of_Stress", "a_Causes_of_Stress", "a_Communication_Availability", "zz_Demo", "zz_Demo") 
vardata <- data.frame(profvars,varlabel,category,row.names=NULL) 

chartdatasplit <- split(chartdata, chartdata$variable) 


server <- function(input, output) { 

    tableize <- function(chartdatasplit){ ###can add additional arguments like dimension - add to where this is called also and how tabledata indexes 
    tables <- list() 
    for (x in names(chartdatasplit)){ ##go through all individually stored variable data frames in chartdatasplit list 
     tabledata <- chartdatasplit[[x]] ###function that returns a dataframe to use in table 
     tables[[as.character(x)]] <- 
     print(xtable(tabledata, caption=paste("Variable:",x)), 
      type="html", include.rownames = FALSE, 
      html.table.attributes='class="data table table-bordered table-condensed"', 
      caption.placement="top") 
    } 
    return(lapply(tables,paste))  
    } 

    output$tables <- renderUI({ 
    out <- unlist(tableize(chartdatasplit)) 
     return(div(HTML(out),class="shiny-html-output")) 
    }) 
} 

ui <- shinyUI(fluidPage(

    uiOutput("tables") 
)) 


shinyApp(ui = ui, server = server) 
+0

Эй, я использую ваше решение, но я кормлю подмножество df посредством реактивного ввода, но когда дело доходит до отображения, оно отображает все возможные переменные в df, а не только в подмножестве, любая помощь будет с большой благодарностью. –

Смежные вопросы