Изменить график на основе ввода в R блестящий - PullRequest
0 голосов
/ 06 марта 2019

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

Тем не менее, в настоящее время он работает, но новый график отображается только в течение 3 секунд, а затем возвращается к исходному графику. Я нашел похожий пример здесь . Этот график обновляется на основе списка реактивных значений, а затем рисует те новые точки, которые выбрал пользователь. Я думаю, что если я найду способ изменить его так, чтобы он рисовал новый график сразу после события щелчка, он должен работать, но застрял на этой части.

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

Пример по ссылке

library(shiny)

ui <- basicPage(
  plotOutput("plot1", click = "plot_click"),
  verbatimTextOutput("info"),
  actionButton("updateplot", "Update Plot:")
)

server <- function(input, output) {
  val <- reactiveValues(clickx = NULL, clicky = NULL)

  observe({
    input$plot_click
    isolate({
      val$clickx = c(val$clickx, input$plot_click$x)
      val$clicky = c(val$clicky, input$plot_click$y)     
    })
  }) #adding clicks to list

  output$plot1 <- renderPlot({
    plot(mtcars$wt, mtcars$mpg)
    input$updateplot
    isolate({
      points(val$clickx, val$clicky)
    })
  })

  output$info <- renderText({
    paste0("x = ", val$clickx, ", y = ",val$clicky, "\n")
  })

}

shinyApp(ui, server)

Ответы [ 2 ]

2 голосов
/ 06 марта 2019

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

Идея состоит в том, что счетчик (trigger) увеличивается при каждом щелчке.Важно использовать req(.) в наблюдателе, чтобы наблюдатель снова не срабатывал при отпускании кнопки мыши (в этом случае input$plot_click установлен на NULL).

Затем renderPlot(.)зависимость от этого trigger и показывает основной или вспомогательный сюжет.

Обновление. Если вы хотите использовать информацию из объекта input$plot_click, вы должны также сохранить ее,чтобы избежать этого, он получает NULL.

library(shiny)
library(ggplot2)

ui <- basicPage(
   plotOutput("plot1", click = "plot_click")
)

server <- function(input, output) {
   plot_data <- reactiveValues(trigger = 0, x = NA, y = NA)

   observe({
      req(input$plot_click)
      isolate(plot_data$trigger <- plot_data$trigger + 1)
      plot_data$x <- input$plot_click$x
      plot_data$y <- input$plot_click$y
    })

   output$plot1 <- renderPlot({
      if (plot_data$trigger %% 2 == 0) {
         plot(1:10, main = "Main Plot")
      } else {
         ggplot() + geom_point(aes(x = plot_data$x, y = plot_data$y), size = 5, shape = 19)
      }
   })
}

shinyApp(ui, server)
1 голос
/ 06 марта 2019

Просто перетащите isolate в свой рендер-график:

library(shiny)

ui <- basicPage(
  plotOutput("plot1", click = "plot_click"),
  verbatimTextOutput("info")
)

server <- function(input, output) {
  val <- reactiveValues(clickx = NULL, clicky = NULL)

  observe({
    input$plot_click
    isolate({
      val$clickx = c(val$clickx, input$plot_click$x)
      val$clicky = c(val$clicky, input$plot_click$y)     
    })
  }) #adding clicks to list

  output$plot1 <- renderPlot({
    plot(mtcars$wt, mtcars$mpg)
    points(val$clickx, val$clicky)
  })

  output$info <- renderText({
    paste0("x = ", val$clickx, ", y = ",val$clicky, "\n")
  })

}

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