Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 快速放大会使人失去控制_R_Ggplot2_Shiny - Fatal编程技术网

R 快速放大会使人失去控制

R 快速放大会使人失去控制,r,ggplot2,shiny,R,Ggplot2,Shiny,我想做一个绘图,你可以放大和缩小与键盘箭头向上和向下。这就是我所做的。它工作得很好,但仍然存在一个主要问题 library(shiny) library(dplyr) library(ggplot2) ui <- fluidPage( tags$script( '$(document).on("keyup", function(e) { if(e.keyCode == 38){ Shiny.onInputChange("

我想做一个绘图,你可以放大和缩小与键盘箭头向上和向下。这就是我所做的。它工作得很好,但仍然存在一个主要问题

library(shiny)
library(dplyr)
library(ggplot2)

ui <- fluidPage(
    tags$script(
        '$(document).on("keyup", function(e) {
    if(e.keyCode == 38){
    Shiny.onInputChange("up", Math.random());
    }
    if(e.keyCode == 40){
    Shiny.onInputChange("down", Math.random());
    }
    });'
    ),
    uiOutput("whole_page")
)

server <- function (input, output, session) {
    min <- 0
    max <- 1000000
    view_size <- reactiveVal(max - min)
    view_center <- reactiveVal(mean(c(max, min)))
    position <- reactiveVal(c(min, max))
    
    observeEvent(c(view_size(), view_center()), {
        from <- (view_center() - (view_size() / 2))
        to <- (view_center() + (view_size() / 2))
        c(from, to) %>% position()
    })
    
    output$whole_page <- renderUI({
        fluidPage(
            sliderInput("slider", "range:", min = min, max= max, value = position(), step = 1),
            plotOutput("plot")
        )
    })

    output$plot <- renderPlot({
        ggplot(data = tibble(pos = position())) +
            geom_point(aes(x = pos, y = 0))
    })
    
    observeEvent(input$slider, {
        input$slider %>% position()
    })
    
    observeEvent(position(), {
        position() %>%
            mean() %>%
            view_center()
        position() %>%
            diff() %>%
            view_size()
    })
    
    observeEvent(input$up, {
        (view_size() / 2) %>%
            view_size()
    })
    
    observeEvent(input$down, {
        (view_size() * 2) %>%
            view_size()
    })
}

shinyApp(ui, server)
库(闪亮)
图书馆(dplyr)
图书馆(GG2)
ui您可以使用来过滤过快的输入更改:

library(shiny)
library(dplyr)
library(ggplot2)

ui <- fluidPage(
  tags$script(
    '$(document).on("keyup", function(e) {
    if(e.keyCode == 38){
    Shiny.onInputChange("up", Math.random());
    }
    if(e.keyCode == 40){
    Shiny.onInputChange("down", Math.random());
    }
    });'
  ),
  uiOutput("whole_page")
)

server <- function (input, output, session) {
  min <- 0
  max <- 1000000
  view_size <- reactiveVal(max - min)
  view_center <- reactiveVal(mean(c(max, min)))
  position <- reactiveVal(c(min, max))
  
  observeEvent(c(view_size(), view_center()), {
    from <- (view_center() - (view_size() / 2))
    to <- (view_center() + (view_size() / 2))
    c(from, to) %>% position()
  })
  
  output$whole_page <- renderUI({
    fluidPage(
      sliderInput("slider", "range:", min = min, max= max, value = position(), step = 1),
      plotOutput("plot")
    )
  })
  
  output$plot <- renderPlot({
    ggplot(data = tibble(pos = position())) +
      geom_point(aes(x = pos, y = 0))
  })
  
  observeEvent(input$slider, {
    input$slider %>% position()
  })
  
  observeEvent(position(), {
    position() %>%
      mean() %>%
      view_center()
    position() %>%
      diff() %>%
      view_size()
  })
  
  up_d <- debounce(reactive({input$up}),500)
  down_d <- debounce(reactive({input$down}),500)
  
  observeEvent(up_d(), {
    (view_size() / 2) %>%
      view_size()
  })
  
  observeEvent(down_d(), {
    (view_size() * 2) %>%
      view_size()
  })
}

shinyApp(ui, server)
库(闪亮)
图书馆(dplyr)
图书馆(GG2)

瓦迪的答案正是我想要的。然而,我已经做了其他的测试,如果这对某人有用的话,我想和大家分享一下。我将滑块替换为第二个图形,如全局视图和缩放视图:

library(shiny)
library(dplyr)
library(ggplot2)

ui <- fluidPage(
    tags$script(
        '$(document).on("keyup", function(e) {
    if(e.keyCode == 38){
    Shiny.onInputChange("up", Math.random());
    }
    if(e.keyCode == 40){
    Shiny.onInputChange("down", Math.random());
    }
    });'
    ),
    uiOutput("whole_page")
)

server <- function (input, output, session) {
    min <- 0
    max <- 1000000
    view_size <- reactiveVal(max - min)
    view_center <- reactiveVal(mean(c(max, min)))
    position <- reactiveVal(c(min, max))
    
    observeEvent(c(view_size(), view_center()), {
        from <- (view_center() - (view_size() / 2))
        to <- (view_center() + (view_size() / 2))
        c(from, to) %>% position()
    })
    
    output$whole_page <- renderUI({
        fluidPage(
           plotOutput("global_plot", height = "100px"),
            plotOutput("zoom_plot", height = "100px")
        )
    })

    output$global_plot <- renderPlot({
        ggplot(data = tibble(pos = c(min, max))) +
            geom_point(aes(x = pos, y = 0))+
            geom_rect(aes(xmin = position()[1], xmax = position()[2], ymin = 0, ymax = 1))
    })
    
    output$zoom_plot <- renderPlot({
        ggplot(data = tibble(pos = c(min, max))) +
            geom_point(aes(x = pos, y = 0))+
            coord_cartesian(position())
    })
    
    observeEvent(position(), {
        position() %>%
            mean() %>%
            view_center()
        position() %>%
            diff() %>%
            view_size()
    })
    
    observeEvent(input$up, {
        (view_size() / 2) %>%
            view_size()
    })
    
    observeEvent(input$down, {
        (view_size() * 2) %>%
            view_size()
    })
}

shinyApp(ui, server)
库(闪亮)
图书馆(dplyr)
图书馆(GG2)

ui按下上/下箭头会触发观察者,这会触发观察者,这会触发观察者。。。。当您快速按箭头两次时,第二个箭头事件会在第一个循环完成之前触发,这会导致混乱

这是一个较轻版本的服务器逻辑,我没有遇到任何问题:

server <- function (input, output, session) {
  min <- 0
  max <- 1000000
  position <- reactiveVal(c(min, max))
  view <- reactiveVal(list(center = mean(c(max, min)), size = max-min))
  
  observeEvent(view(), {
    from <- with(view(), center - size/2)
    to <- with(view(), center + size/2)
    updateSliderInput(session, "slider", value = c(from,to))
  }, ignoreInit = TRUE)
  
  output$whole_page <- renderUI({
    fluidPage(
      sliderInput("slider", "range:", min = min, max= max, value = c(min,max), step = 1),
      plotOutput("plot")
    )
  })
  
  output$plot <- renderPlot({
    ggplot(data = tibble(pos = position())) +
      geom_point(aes(x = pos, y = 0))
  })
  
  observeEvent(input$slider, {
    input$slider %>% position()
    list(center = mean(position()), size = diff(position())) %>% view()
  })
  
  observeEvent(input$up, {
    with(view(), list(center = center, size = size/2)) %>% view()
  })
  
  observeEvent(input$down, {
    with(view(), list(center = center, size = size*2)) %>% view()
  })
}

shinyApp(ui, server)

server非常感谢您的回答,这正是我想要的。也许我会把延迟减少到100毫秒。