Блестящее приложение для создания сводной таблицы столбцов на основе пользовательского ввода - PullRequest
0 голосов
/ 04 марта 2020

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



library(shiny)
library(dplyr)

df <- data.frame(grouping_letter = c('A', 'A', 'B', 'B', 'C', 'C'), 
                 grouping_animal = c('Cat', 'Dog', 'Cat', 'Dog', 'Cat', 'Dog'),
                 value = c(1,2,3,4,5,6))

df <- df %>% mutate(
    grouping_letter = as.character(grouping_letter),
    grouping_animal = as.character(grouping_animal))

# Define UI for application that summarizes a table
ui <- fluidPage(

    selectInput(inputId ="column",
                label = "Choose Column for Summary",
                choices = names(df),
                selected = "grouping_letter"),

    tableOutput('table')
)

# Define server logic required to output summary table
server <- function(input, output) {
    groupvar <- reactive({input$column})
    cols <- c('value', unlist(groupvar))
    dt_f <- df[,cols] %>%
        group_by_at(2) %>%
        summarise (value = n(), yield = round(mean(value)*100, 1)) %>%
        mutate(Pct_of_value = paste0(round(100 * value/sum(value), 0), "%"))
    output$table <- renderTable(dt_f)
}

# Run the application 
shinyApp(ui = ui, server = server)

Я получаю сообщение об ошибке: Предупреждение: Ошибка в .subset: недопустимый тип индекса «list» Я использую R 3.6 и RStudio на windows

1 Ответ

0 голосов
/ 05 марта 2020

Есть две проблемы

  • groupvar является реактивным, поэтому вы не хотите отменять реактивное значение.
  • Вам нужно использовать groupvar() для получения значений внутри реактивного объекта. Однако, чтобы запустить groupvar(), вам нужно сделать это в активном реактивном контексте: например, observe, observeEvent или renderXXX. Чтобы дать вам не очень точное представление о том, что блестящие функции, которые позволяют вам использовать function({}) выражений.

Смотрите мой код ниже, это должно быть то, что вы хотите. Обратите внимание, как я использую renderTable.

library(shiny)
library(dplyr)

df <- data.frame(grouping_letter = c('A', 'A', 'B', 'B', 'C', 'C'), 
                 grouping_animal = c('Cat', 'Dog', 'Cat', 'Dog', 'Cat', 'Dog'),
                 value = c(1,2,3,4,5,6))

df <- df %>% mutate(
    grouping_letter = as.character(grouping_letter),
    grouping_animal = as.character(grouping_animal))

# Define UI for application that summarizes a table
ui <- fluidPage(

    selectInput(inputId ="column",
                label = "Choose Column for Summary",
                choices = names(df),
                selected = "grouping_letter"),

    tableOutput('table')
)

# Define server logic required to output summary table
server <- function(input, output) {
    groupvar <- reactive({input$column})

    output$table <- renderTable({
        df[, c('value', groupvar())] %>%
            group_by_at(2) %>%
            summarise (value = n(), yield = round(mean(value)*100, 1)) %>%
            mutate(Pct_of_value = paste0(round(100 * value/sum(value), 0), "%"))
    })
}

# Run the application 
shinyApp(ui = ui, server = server)

...