Вывод взвешенной таблицы в Shiny

Я пытаюсь создать блестящее приложение, которое будет создавать взвешенные таблицы, используя svytable для интересующих меня переменных в наборе данных. Однако я не получаю никакого вывода, возвращая ошибку «объект «вход» не найден». Вот код для воспроизведения моей проблемы.

df <- data.frame(col1 = rnorm(20, 0, 1), col2 = rnorm(20, 2, 2), w = rnorm(20, 1, .2))
df.w <- svydesign(id = ~1, data = df, weights = ~w)

ui <- fluidPage(
        selectInput("v1", "Choose column", colnames(df), selected = "col1"),
        verbatimTextOutput("table")
)
server <- shinyServer(function(input,output){
  output$table <- renderPrint({
    svytable(~input$v1, df.w)
  })
})
shinyApp(ui, server)

person Masood Sadat    schedule 16.12.2017    source источник


Ответы (1)


Вы получаете эту ошибку, так как input$v1 является строкой, но svytable ожидает formula. Вы можете преобразовать строки в формулы, используя as.formula

library(shiny)
library(survey)

df <- data.frame(col1 = rnorm(20, 0, 1), col2 = rnorm(20, 2, 2), w = rnorm(20, 1, .2))
df.w <- svydesign(id = ~1, data = df, weights = ~w)

ui <- fluidPage(
  selectInput("v1", "Choose column", colnames(df), selected = "col1"),
  verbatimTextOutput("table")
)

server <- function(input, output){
  output$table <- renderPrint({
    myformula <- as.formula(paste0("~", input$v1))
    svytable(myformula, df.w)
  })
}

shinyApp(ui, server)
person Gregor de Cillia    schedule 16.12.2017
comment
Спасибо, это сработало! Интересно, как ты это узнал? Или лучше вопрос, как я мог знать? я относительно новый - person Masood Sadat; 16.12.2017
comment
На самом деле это распространенная проблема. Формулы всегда сложны, когда вы хотите создать их динамически, как вы сделали здесь. В целях отладки (в блестящем) вы можете вызывать browser() внутри ваших функций рендеринга (или reactive выражений). - person Gregor de Cillia; 16.12.2017
comment
Есть ли способ сохранить df.w на потом? Мой набор данных составляет около 1 ГБ, и создание df.w может занять некоторое время, поэтому это сэкономит время и улучшит работу с блестящим приложением, которое я разрабатываю. - person Masood Sadat; 17.12.2017