我正试图使用Shiny构建一个响应式应用程序,以使用R包onewaytests
检索描述性统计信息。
在选择了要在描述性统计中使用的列变量后,我无法成功地使用它们来创建公式对象,例如describe(parktime ~ parkstop, test)
。我试过renderDataTable
、renderTable
、renderText
和renderUI
。什么都不起作用,我收到错误消息:
警告:描述中出错:组变量的名称不匹配数据中的变量名。组变量必须是一个因子。[无可用堆栈跟踪]
这是我的错误代码:
library(shiny)
library(onewaytests)
# create test data
test <- data.frame("likert" = c(1,1,1,3,1,3,2,2,1,4,2,2,3,3,4,4,5,5),
"parkspot" = c(1,1,1,4,1,2,1,3,1,4,3,3,2,2,1,1,2,4),
"parktime" = c(5,10,5,13,5,1,10,5,1,15,2,43,2,3,4,2,11,1),
"walktime" = c(5,5,30,5,3,1,10,5,5,5,5,12,11,2,3,4,4,3))
# likert and parkspot to factor
test[, 1] <- as.factor(test[, 1])
test[, 2] <- as.factor(test[, 2])
# give names
levels(test$likert) <- list("Extremely familiar" = 1,
"Moderately familiar" = 2,
"Somewhat familiar" = 3,
"Slightly familiar" = 4,
"Not at all familiar" = 5)
levels(test$parkspot) <- list("On the side of street" = 1,
"Parking lot" = 2,
"Parking garage" = 3,
"Other" = 4)
# This runs fine outside of shinyApp
describe(walktime ~ parkspot, test)
# shinyApp code
server <- function(input, output){
# some unsuccessful tests
output$test1 <- renderTable({
describe(input$resp ~ input$expl, test)
})
output$test2 <- renderText({
paste(input$resp,
input$expl)
})
output$test3 <- renderDataTable({
describe(input$resp ~ input$expl, test)
})
}
ui <- shinyUI(fluidPage(
titlePanel("thing"),
sidebarLayout(
sidebarPanel(
#walktime or parktime
selectInput("resp",
"response (continuous)",
names(test[-c(1,2)])),
# all others
selectInput("expl",
"explanatory (ordinal)",
names(test[-c(3,4)]))
),
mainPanel(
tableOutput("test1"),
verbatimTextOutput("test2"),
dataTableOutput("test3")
)
)
))
shinyApp(ui = ui, server = server, options = list("test.mode"))
有可能吗?看起来describe()
在应用程序内失败。在Shiny应用程序之外运行onewaytests的describe()
完全正常,如下所示:
n Mean Std.Dev Median Min Max 25th 75th Skewness Kurtosis NA
On the side of street 8 8.125000 9.109453 5 3 30 3.75 6.25 2.0290427 5.475618 0
Parking lot 4 4.500000 4.509250 3 1 11 1.75 5.75 0.9067530 2.122279 0
Parking garage 3 7.333333 4.041452 5 5 12 5.00 8.50 0.7071068 1.500000 0
Other 3 4.333333 1.154701 5 3 5 4.00 5.00 -0.7071068 1.500000 0
您需要从input
中获取resp
和expl
的字符串,并创建一个公式:
describe(as.formula(paste(input$resp, '~', input$expl)), test)