Причины event_data () не регистрирует полный диапазон поверхности, когда первое измерение <второе измерение - PullRequest
0 голосов
/ 24 сентября 2018

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

library(shiny)
library(plotly)
# Define UI for application that draws a histogram
ui <- fluidPage(

   # Application title
   titlePanel("plotly_event problems"),

   # Sidebar with a slider input for number of bins 
   sidebarLayout(
      sidebarPanel(
        selectInput("vis_type", "Select type of visualisation",
                    choices = c(
                      "x and y the same (ok)" = "x_y_same",
                      "x and y same step but diff length (ok)"= "x_y_same_step",
                      "x and y same step but diff length 2(fail)"= "x_y_same_step_2",

                      "x and y diff step but same length (fail)" = "x_y_diff_step",
                      "x and y diff step but same length 2 (ok)" = "x_y_diff_step_2"

                    ),
                    selected = "x_y_same"
                    )
      ),

      # Show a plot of the generated distribution
      mainPanel(
         plotlyOutput("examples"),
         verbatimTextOutput("hover_output")
      )
   )
)

# Define server logic required to draw a histogram
server <- function(input, output) {

   output$examples <- renderPlotly({

      if(input$vis_type == "x_y_same"){
        x <- seq(0, 1, by = 0.01)
        y <- seq(0, 1, by = 0.01)
        z <- outer(X = x, Y = y)
        cat(file = stderr(), 
            "vis_type: ", input$vis_type, 
            ". len_x: ", length(x), 
            ";len_y: ", length(y),
            "; dim_z: ", dim(z), "\n")
        p <- plot_ly(z = ~z) %>%
          add_surface()

      } else if (input$vis_type == "x_y_same_step") {
        x <- seq(0, 2, by = 0.01)
        y <- seq(0, 1, by = 0.01)
        z <- outer(X = x, Y = y)

        cat(file = stderr(), 
            "vis_type: ", input$vis_type, 
            ". len_x: ", length(x), 
            ";len_y: ", length(y),
            "; dim_z: ", dim(z), "\n")

        p <- plot_ly(z = ~z) %>%
          add_surface()

      } else if (input$vis_type == "x_y_diff_step"){
        x <- seq(0,1,by= 0.02)
        y <- seq(0,1, by = 0.01)
        z <- outer(X = x, Y = y)
        cat(file = stderr(), 
            "vis_type: ", input$vis_type, 
            ". len_x: ", length(x), 
            ";len_y: ", length(y),
            "; dim_z: ", dim(z), "\n")


        p <- plot_ly(z = ~z) %>% 
          add_surface()
      } else if (input$vis_type == "x_y_same_step_2") {
        x <- seq(0,1, by = 0.01)
        y <- seq(0, 2, by = 0.01)
        z <- outer(X = x, Y = y)
        cat(file = stderr(), 
            "vis_type: ", input$vis_type, 
            ". len_x: ", length(x), 
            ";len_y: ", length(y),
            "; dim_z: ", dim(z), "\n")

        p <- plot_ly(z = ~z) %>% 
          add_surface()
      } else if (input$vis_type == "x_y_diff_step_2"){
        x <- seq(0, 1, by = 0.01)
        y <- seq(0, 1, by = 0.02)
        z <- outer(X = x, Y = y)
        cat(file = stderr(), 
            "vis_type: ", input$vis_type, 
            ". len_x: ", length(x), 
            ";len_y: ", length(y),
            "; dim_z: ", dim(z), "\n")


        p <- plot_ly(z = ~z) %>% 
          add_surface()
      }

     return (p)
   })

   output$hover_output <- renderPrint({
     s <- event_data("plotly_hover")
     if (length(s) == 0){
       "Move around!"
     } else {
       as.list(s)
     }

   })
}

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

Выводы cat следующие:

vis_type:  x_y_same . len_x:  101 ;len_y:  101 ; dim_z:  101 101 
vis_type:  x_y_same_step . len_x:  201 ;len_y:  101 ; dim_z:  201 101 
vis_type:  x_y_same_step_2 . len_x:  101 ;len_y:  201 ; dim_z:  101 201 
vis_type:  x_y_diff_step . len_x:  51 ;len_y:  101 ; dim_z:  51 101 
vis_type:  x_y_diff_step_2 . len_x:  101 ;len_y:  51 ; dim_z:  101 51 

В тех случаях, когда тусклое (z) 1 > = dim (z) 2 , выход event_data() правильно покрывает весь диапазон поверхности.См. Этот пример:

hover working

Однако в тех случаях, когда dim (z) 1 2 , выход event_data() правильно регистрируется только для значений, где dim (z) оба <= dim (z) <a href="https://i.stack.imgur.com/nx1JX.png" rel="nofollow noreferrer"> 1 , как в этих примерах:

hover fails 1

hover fails 2

Вопросы:

  1. Существуют ли какие-либо конкретные аргументы для заговора, которые исправят это поведение?
  2. Можете ли вы предложить какие-либо обходные решения этой проблемы, чтобы event_data правильно регистрировалась для всего отображаемого диапазона поверхности?

Большое спасибо, Джон

...