Невозможно получить объект во вложенном наблюдаемом событии | R блестящий - PullRequest
0 голосов
/ 28 августа 2018

В этом примере - наблюдаем событие (input $ plot_dblclick {code}) возникли проблемы. Не удалось дважды щелкнуть мышью после кисти. Это также не дает сообщения об ошибке. Может кто-нибудь помочь мне найти проблему? Вы можете найти входные файлы здесь .

ui <- fluidPage(

  titlePanel("Example"),

  sidebarLayout(
    sidebarPanel(

      textInput("numb", "Entre a id between G1-G19:"),
      actionButton("find", "Find")

    ),

    mainPanel(

      tabsetPanel(type = "tabs",
                  tabPanel("Interactive Plot", 
                           plotOutput("plot", click = "plot_click",
                                      height = 300,
                                      dblclick = "plot_dblclick",
                                      brush = brushOpts(
                                        id = "plot_brush",
                                        resetOnNew = TRUE
                                      )),
                           verbatimTextOutput("info")

                  ),

                  tabPanel("Table", dataTableOutput("table"))

      ) #tabstPanel ends here

    ) # mainPanel ends here
  ) 

)

Я полагаю, рекурсивный объект наблюдающий в приведенном ниже скрипте не может вызвать пользовательский интерфейс.

server <- function(input, output) {

  # Loading packages
  library(data.table)
  library(maptools)
  library(maps)
  library(ggmap)
  library(ggplot2)
  library(plyr)

  observeEvent(input$find, { # "Find" button event

      area_density <- read.csv("density.csv", sep = ",", row.names = 1)
      cordinates <- read.csv("cordinate.csv", sep = ",")

      input_id <- input$numb
      area_density_t <- t(area_density[input_id,])
      area_density_t_df <- as.data.frame(area_density_t)
      area_density_t_df_data <- setDT(area_density_t_df, keep.rownames = TRUE)[]
      colnames(area_density_t_df_data)[1] <- "id"

      final_table <- merge(x=area_density_t_df_data, y=cordinates, by= "id", all=TRUE)
      colnames(final_table)[2] <- "density"

      top3 <- head(arrange(final_table, desc(final_table$density)) , n = 3)
      last3 <- tail(arrange(final_table, desc(final_table$density)) , n = 3)


      ############## Map ####################

      ranges <- reactiveValues(x = NULL, y = NULL)
      # Generating Map
      mapWorld <- borders("world", colour="gray50", fill="gray50") # create a layer of borders
      mp <- ggplot() +   mapWorld
      mp <- mp+ geom_point(aes(x=final_table$longitude, y=final_table$latitude) ,color="blue", size=3)+
                coord_cartesian(xlim = ranges$x, ylim = ranges$y, expand = FALSE) 
      mp <- mp+ geom_point(aes(x=top3$longitude, y=top3$latitude) ,color="red", size=3)
      mp <- mp+ geom_point(aes(x=last3$longitude, y=last3$latitude) ,color="green", size=3)


      # Printing Map to screen
      output$plot <- renderPlot({
        mp
      })

      ################# Interactive Plot (Map) modifications #################

      # Plot Click
      output$info <- renderText({
        paste("\nLongitude=", input$plot_click$x, 
              "\nLatitude=", input$plot_click$y
        )
      })

      # Zoom
      # When a double-click happens, check if there's a brush on the plot.
      # If so, zoom to the brush bounds; if not, reset the zoom.
      observeEvent(input$plot_dblclick, {
        brush <- input$plot_brush
        if (!is.null(brush)) {
          ranges$x <- c(brush$xmin, brush$xmax)
          ranges$y <- c(brush$ymin, brush$ymax)

        } else {
          ranges$x <- NULL
          ranges$y <- NULL
        }
      })

      ############ Printing the table to screen on table tab #########
       output$table = renderDataTable({
        final_table
      })

  })  # observeEvent ends here

} # Server fucntion ends here

1 Ответ

0 голосов
/ 29 августа 2018

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

ui <- fluidPage(

  titlePanel("Example"),

  sidebarLayout(
    sidebarPanel(

      textInput("numb", "Entre a id between G1-G19:"),
      actionButton("find", "Find")

    ),

    mainPanel(

      tabsetPanel(type = "tabs",
                  tabPanel("Interactive Plot", 
                           plotOutput("plot", click = "plot_click",
                                      height = 300,
                                      dblclick = "plot_dblclick",
                                      brush = brushOpts(
                                        id = "plot_brush",
                                        resetOnNew = TRUE
                                      )),
                           verbatimTextOutput("info")

                  ),

                  tabPanel("Table", dataTableOutput("table"))

      ) #tabstPanel ends here

    ) # mainPanel ends here
  ) 

)

  # Loading packages outside of server
  library(data.table)
  library(maptools)
  library(maps)
  library(ggmap)
  library(ggplot2)
  library(plyr)
server <- function(input, output) {

  ranges <- reactiveValues(x = NULL, y = NULL)

  mp_table <- eventReactive(input$find, { # "Find" button event

    area_density <- read.csv("~/Downloads/density.csv", sep = ",", row.names = 1)
    cordinates <- read.csv("~/Downloads/cordinate.csv", sep = ",")

    input_id <- input$numb
    area_density_t <- t(area_density[input_id,])
    area_density_t_df <- as.data.frame(area_density_t)
    area_density_t_df_data <- setDT(area_density_t_df, keep.rownames = TRUE)[]
    colnames(area_density_t_df_data)[1] <- "id"

    final_table <- merge(x=area_density_t_df_data, y=cordinates, by= "id", all=TRUE)
    colnames(final_table)[2] <- "density"

    final_table
  })

    ############## Map ####################
  mp <- reactive({
    final_table <- mp_table()
    top3 <- head(arrange(final_table, desc(final_table$density)) , n = 3)
    last3 <- tail(arrange(final_table, desc(final_table$density)) , n = 3)
    # Generating Map
    mapWorld <- borders("world", colour="gray50", fill="gray50") # create a layer of borders
    mp <- ggplot() +   mapWorld
    mp <- mp+ geom_point(aes(x=final_table$longitude, y=final_table$latitude) ,color="blue", size=3)+
      coord_cartesian(xlim = ranges$x, ylim = ranges$y, expand = FALSE) 
    mp <- mp+ geom_point(aes(x=top3$longitude, y=top3$latitude) ,color="red", size=3)
    mp <- mp+ geom_point(aes(x=last3$longitude, y=last3$latitude) ,color="green", size=3)
    mp

  })  
  # Printing Map to screen
  output$plot <- renderPlot({
    mp()
  })

  ################# Interactive Plot (Map) modifications #################

  # Plot Click
  output$info <- renderText({
    paste("\nLongitude=", input$plot_click$x, 
          "\nLatitude=", input$plot_click$y
    )
  })

  # Zoom
  # When a double-click happens, check if there's a brush on the plot.
  # If so, zoom to the brush bounds; if not, reset the zoom.
  observeEvent(input$plot_dblclick, {
    brush <- input$plot_brush
    if (!is.null(brush)) {
      ranges$x <- c(brush$xmin, brush$xmax)
      ranges$y <- c(brush$ymin, brush$ymax)

    } else {
      ranges$x <- NULL
      ranges$y <- NULL
    }
  })

  ############ Printing the table to screen on table tab #########
  output$table = renderDataTable({
   mp_table()
  })

} # Server fucntion ends here

shinyApp(ui,server)

Надеюсь, это поможет !!

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