Используйте selectInput () для выбора данных в классе R6 - PullRequest
1 голос
/ 03 июля 2019

Я пытаюсь понять, как я могу использовать R6 Class Objects в приложении Shiny, и я хотел визуализировать данные в R6 Object, используя выбор selectInput().Выбранные варианты ввода содержат имена моих R6 объектов.

У меня есть следующие объекты:

library(R6)
Person <- R6Class("Person", list(
  name = NULL,
  age = NA,
  sons = NA,
  initialize = function(name, age = NA, sons = NA) {
    self$name <- name
    self$age <- age
    self$sons <- sons
  }
))

Manel <- Person$new("Manel", age = 42, sons = c('Joana', 'Gabriel'))
Carla <- Person$new("Maria", age = 44, sons = NA)
Matilde <- Person$new("Matilde", age = 52, sons = c('Bruno', 'Joana', 'Maria'))

В моем приложении Shiny у меня есть selectInput() с вариантами выбора Manel, CarlaМатильда.Что мне нужно, так это то, что, когда я выбираю выбор, я отображаю значения для объекта с именем, которое я выбрал в selectInput ().Приложение Shiny ниже:

library(shiny)
ui <- fluidPage(
  sidebarPanel(
    selectInput('names', 'Names', choices = c('Manel', 'Carla', 'Matilde'))
    ),
  mainPanel(
    uiOutput('name'),
    uiOutput('age'),
    uiOutput('sons')
  )
)

server <- function(input, output, session) {
  output$name <- renderText(Manel$name)
  output$age <- renderText(Manel$age)
  output$sons <- renderText(Manel$sons)
}

shinyApp(ui, server)

Спасибо!

1 Ответ

1 голос
/ 03 июля 2019

input$names всегда будет просто менять значение символа.Чтобы получить значение переменной из ее имени в виде символа, вы можете использовать функцию get().Здесь мы можем обернуть это в реактивный объект, чтобы у нас всегда был доступ к «текущему» человеку для реактивного выхода.Мы можем сделать

server <- function(input, output, session) {
  person <- reactive(get(input$names))

  output$name <- renderText(person()$name)
  output$age <- renderText(person()$age)
  output$sons <- renderText(person()$sons)
}

В качестве альтернативы, возможно, имеет смысл хранить ваших людей в именованном списке, а не в куче переменных.Например,

people <- list(
  Manel = Person$new("Manel", age = 42, sons = c('Joana', 'Gabriel')),
  Carla = Person$new("Carla", age = 44, sons = NA),
  Matilde = Person$new("Matilde", age = 52, sons = c('Bruno', 'Joana', 'Maria'))
)

Затем вы можете использовать символьное значение из выбора только для индексации именованного списка вместо использования get().

server <- function(input, output, session) {
  person <- reactive(people[[input$names]])

  output$name <- renderText(person()$name)
  output$age <- renderText(person()$age)
  output$sons <- renderText(person()$sons)
}
...