объект типа ‘closure’ не поддается замене: R блестящее приложение

#r #graph #shiny

#r #График #блестящий

Вопрос:

Я пытаюсь создать графическое приложение, используя R shiny. Поэтому я принимаю от пользователя входные данные для маршрута, идентификатора остановки / поездки (посадка, высадка или загрузка). Таким образом, ui.r является

 ui <- fluidPage(
  pageWithSidebar(
    headerPanel('FAST_TRIPS Visulization', windowTitle = "Fast_trips Visaualization"),
    sidebarPanel(
      selectInput('route', 'Choose the Route No.', unique(y['route_id'])),
      selectInput('id', 'Please Choose Stop or Trip ID', c('stop_id','trip_id')),
      selectInput('rider', 'What do you wanna compare?', c('boarding', 'alighting', 'load')),
      radioButtons('method','Please select your method', c('Sum', 'Average'))),
    mainPanel(

      plotOutput('plot1')

    )
  )
)
  

Затем я пытаюсь извлечь данные для конкретного маршрута и агрегированные значения, например, для посадки с помощью stop_id, и пытаюсь создать диаграмму для этих stop_id. Сервер.R находится ниже

 server <- function(input, output, session) {

  # Combine the selected variables into a new data frame



  selectedData <- reactive({
    y[c('route_id', input$id, input$rider)]

  })

  data <- reactive({
    subset(selectedData, route_id == input$route)
    })
  a <- reactive({
    aggregate(input$rider~input$id,data,input$method)
    })

  s <- reactive({input$rider})

output$plot1 <- renderPlot({barplot(a[s])})

}
  

Но я получаю следующую ошибку:

 Error: object of type 'closure' is not subsettable
  

Пожалуйста, помогите мне с этим. Я новичок в shiny.

Ответ №1:

Вы должны получить доступ к реактивному выражению как к функции, поэтому вам нужно добавлять () к любому вызову переменной, созданной как реактивное выражение.

Вместо:

subset(selectedData, route_id == input$route)

попробуйте использовать:

subset(selectedData(), route_id == input$route)

или даже используйте дополнительную переменную, чтобы избежать проблем.

 selectedData_ <- selectedData()
subset(selectedData_, route_id == input$route)
  

Наконец, вам не нужно вставлять единицу input в реактивное выражение, просто используйте его в любом другом реактивном выражении как renderPlot .

Вместо

 s <- reactive({input$rider})
output$plot1 <- renderPlot({barplot(a[s])})
  

Использовать только

 output$plot1 <- renderPlot({
  a_ <- a()
  barplot(a_[input$rider])
})
  

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