在闪亮的列联表

时间:2016-02-01 15:07:13

标签: r shiny

我有一张桌子:

structure(list(Gender = structure(c(2L, 1L, 2L, 2L, 2L), .Label = c("Female", 
"Male"), class = "factor"), AGE = c(20L, 20L, 15L, 16L, 13L), 
    BOTTLE_CNT = c(3L, 0L, 0L, 1L, 2L), QUALIFICATION_DESC = structure(c(2L, 
    2L, 1L, 2L, 2L), .Label = c("12th and below", "Graduation"
    ), class = "factor")), .Names = c("Gender", "AGE", "BOTTLE_CNT", 
"QUALIFICATION_DESC"), class = "data.frame", row.names = c(NA, 
-5L))

我正在构建一个闪亮的应用程序来呈现列联表。由于它是一个大表,我使用了以下代码:

library(shiny)

shinyApp(
    ui=shinyUI(bootstrapPage(
        fluidRow(
            column(3,
                   div(style = "font-size: 13px;", selectInput("colum", "Select Column Variable", ''))
            ),
            column(3,
                   div(style = "font-size: 13px;", selectInput("rowvar", label = "Select Row Variable", ''))
            )),
        fluidRow(
            tableOutput('foo')    
            )
    )),
    server=shinyServer(function(input, output, session) {

        s <- reactive(
            a
            )


        observe({
            updateSelectInput(session, "colum", choices = sort(as.character(colnames(s()))))
        })

        observe({
            updateSelectInput(session, "rowvar", choices = sort(as.character(colnames(s()))))
        })

        output$foo <- renderTable({
            with(s(), table(input$rowvar, input$colum))
        })
    })
)

而不是使用(s(),table ......我尝试过,使用

xtabs(~input$rowvar + input$colum, s())

如果直接使用列名和行名,两者都不起作用。我想要的是选择的行和列变量,这两个变量的交叉表是必需的。我尝试使用CrossTable中的library(gmodels),但无法弄清楚。

1 个答案:

答案 0 :(得分:2)

您需要将对象传递给tableinput$rowvarinput$colum是字符串。

你可以尝试:

with(s(), table(get(input$rowvar),get(input$colum)))

如果您想使用xtabs,可以尝试使用pasteas.formula从输入中创建公式:

xtabs(as.formula(paste0("~",input$rowvar,"+",input$colum)), s())

此外,您可以设置用户可以直接在updateSelectInput中选择的值,而不是使用ui.R

selectInput("colum", "Select Column Variable", sort(as.character(colnames(a))))

如果您想使用updateSelectInput,您可能希望在renderTable中使用validate / need,否则应用会在初始化时抛出错误,因为input$columinput$rowvar为{ {1}}更新之前:

NULL