R Shiny: группируйте переменные под уникальной меткой и используйте эту метку в реактивном выводе - PullRequest
0 голосов
/ 11 июня 2019

У меня есть фрейм данных с 60 столбцами, и я хотел бы провести анализ основных компонентов (PCA), но только с некоторыми столбцами.Есть ли способ перегруппировать эти столбцы под уникальной меткой и вызвать эту метку в реактивном выводе?

Вот воспроизводимый пример:

  • прежде всего: мы создаем две подгруппыв mtcars (CAT1 и CAT2) и создайте вектор, содержащий имена столбцов (все эти пакеты не нужны)
library(easypackages)
libraries("readxl", "tidyselect", "DT", "shiny", "treemap", "plm", "shinydashboard", "data.table", "formattable", "plotly", "FactoMineR", "factoextra")

CAT1 <- mtcars[, 3:5]
CAT2 <- mtcars[, 5:8]
noms1 <- names(CAT1)
noms2 <- names(CAT2)
  • , затем мы создаем пользовательский интерфейс, где мыпоместите два вектора, содержащие имена, в choices:
ui <- dashboardPage(
  dashboardHeader(title = "test with mtcars", titleWidth = 1000),
  dashboardSidebar(
    selectizeInput("var.acp", "PCA variables", 
                   choices = c("noms1", "noms2"),
                   selected = "noms1", multiple = FALSE),
    selectizeInput("sample", "Sample", choices = unique(rownames(mtcars)), 
                   selected = rownames(mtcars), multiple = TRUE)
  ),
  dashboardBody(
    tabsetPanel(
      tabPanel("test with mtcars",
               box(title = "PCA mtcars",
                   status = "primary",
                   solidHeader = TRUE,
                   collapsible = TRUE,
                   dataTableOutput("pca"),
                   width = 12)
               )
      )
    )
  )
  • наконец, вот код для вывода, который я хотел бы создать:

  server <- function(input, output) {

    sample.choice <- reactive({
      out <- input$sample
      out
    })

    acp <- reactive({
      out <- input$var.acp
      out
    })

    user.selection <- reactive({
      data.user <- mtcars[rownames(mtcars) %in% sample.choice(), ]
      data.user <- mtcars[, acp()]
    })

    output$pca <- renderDataTable({
      dpca <- user.selection()
      dpca <- na.omit(dpca)
      tmp <- prcomp(dpca, scale = TRUE)
      tmp <- data.table(get_eig(tmp))
      tmp
    })
  }


shinyApp(ui, server)

Предполагается, что выводом будет таблица, содержащая собственные значения PCA, реализованные в каждой из двух подгрупп mtcars.Однако я получаю сообщение об ошибке: undefined columns selected.Ошибка должна быть с data.user <- mtcars[, acp()], но это странно, потому что mtcars распознает столбцы, когда я их называю:

head(mtcars[, noms1])

    # disp  hp drat
    # Mazda RX4          160 110 3.90
    # Mazda RX4 Wag      160 110 3.90
    # Datsun 710         108  93 3.85
    # Hornet 4 Drive     258 110 3.08
    # Hornet Sportabout  360 175 3.15
    # Valiant            225 105 2.76

Есть ли способ исправить это?(извините, если сообщение немного длинное)

1 Ответ

0 голосов
/ 11 июня 2019

Основываясь на ответе Стефана Лорана, вот как это исправить:

    acp <- reactive({
      out <- switch(input$var.acp, "noms1"=noms1, "noms2"=noms2)
      out
    })

вместо

    acp <- reactive({
      out <- input$var.acp
      out
    })

в server.

...