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毫秒。