Shiny: ignoreNULL не работает, когда функция eventReactive принимает вывод из другой функции eventReactive в качестве ввода? - PullRequest
0 голосов
/ 03 февраля 2019

Я работаю над приложением Shiny, которое сначала генерирует данные, а затем строит график на основе выбранных входных данных (какой столбец построить, какой цвет использовать и т. Д.).

Я ожидаю, что данные будут сгенерированы только после нажатия пользователем кнопки действия (кнопка действия 1), и график будет создан вместе с данными на основе выбранных по умолчанию входных данных.А когда пользователь хочет изменить входные данные, ему нужно будет нажать другую кнопку действия (кнопка действия 2), чтобы обновить график.Когда пользователь нажимает кнопку действия 2, данные не должны генерироваться повторно.

Есть ли способ сделать это?

Я попытался ignoreNULL для eventReactive (), но установил ignoreNULL =ЛОЖЬ для построения реактивной функции не работает, когда для реактивной функции, генерирующей данные, установлено значение ИСТИНА

Ниже приведен простой пример того, что я пытаюсь сделать:

library(shiny)

ui <- fluidPage(
  titlePanel("Test"),
  sidebarLayout(
    sidebarPanel(
      actionButton('data', 'Generate Random Data'),
      hr(),
      radioButtons("column", label = "Select Column: ", choices = c("x", "y")),
      actionButton('plot', 'Plot')
    ),
    mainPanel(
      plotOutput("result")
    )
  )
)

server <- function(input, output) {
  #### read in data
  dataReactive <- eventReactive(input$data, {
    dt <- data.frame("x" = rnorm(100), "y" = rnorm(100, mean = 100))
  }, ignoreNULL = FALSE)
  plotReactive <- eventReactive(input$plot, {
    dt <- dataReactive()
    p <- hist(dt[[input$column]])
  }, ignoreNULL = FALSE)
  output$result <- renderPlot({
    p <- plotReactive()
  })
}

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

Я ожидаю, что приложение запустится с пустой страницы, и при первом нажатии кнопки «Создать случайные данные» гистограмма будет отображаться без нажатия кнопки «График».Но когда выбран столбец, нажмите кнопку «График», чтобы обновить график.

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

Любая помощь будет оценена.Спасибо.

1 Ответ

0 голосов
/ 04 февраля 2019

Это то, что вы ожидаете?

library(shiny)

ui <- fluidPage(
  titlePanel("Test"),
  sidebarLayout(
    sidebarPanel(
      actionButton('data', 'Generate Random Data'),
      hr(),
      radioButtons("column", label = "Select Column: ", choices = c("x", "y")),
      actionButton('plot', 'Plot')
    ),
    mainPanel(
      plotOutput("result")
    )
  )
)

server <- function(input, output) {
  #### read in data
  dataReactive <- eventReactive(input$data, {
    print('generationg')
    dt <- data.frame("x" = rnorm(100), "y" = rnorm(100, mean = 100))
  })
  plotReactive <- eventReactive({
      input$plot
      input$data
    }, {
    dt <- dataReactive()
    p <- hist(dt[[input$column]])
  }, ignoreNULL = FALSE)
  output$result <- renderPlot({
    p <- plotReactive()
  })
}

# Run the application 
shinyApp(ui = ui, server = server) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...