我有一张桌子:
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)
,但无法弄清楚。
答案 0 :(得分:2)
您需要将对象传递给table
,input$rowvar
和input$colum
是字符串。
你可以尝试:
with(s(), table(get(input$rowvar),get(input$colum)))
如果您想使用xtabs
,可以尝试使用paste
和as.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$colum
和input$rowvar
为{ {1}}更新之前:
NULL