闪亮的传播变化中需要去的反应性表达式。我们可以用isolate
抑制某些行为,但是我们可以根据自己的逻辑表达来抑制被传播的变化吗?
我给出的示例是一个简单的散点图,我们用用户单击的abline
绘制十字路口。不幸的是,Shiny认为结果是一个新图,我们的点击值将重置为NULL
...又将其视为像往常一样传播的值的更新。该图被重新绘制,NULL
传递给abline
的两个参数。
我的hack(下面评论)是在renderPlot
调用中放置条件,该条件只有在点击值是非NULL
时才更新绘图坐标的一些非反应变量。这对于微不足道的图很好,但实际上导致图被绘制了两次。
有什么更好的方法?有没有正确的方式?方式?
服务器文件:
library(shiny)
shinyServer(function (input, output)
{
xclick <- yclick <- NULL
output$plot <- renderPlot({
#if (!is.null(input$click$x)){
xclick <<- input$click$x
yclick <<- input$click$y
#}
plot(1, 1)
abline(v = xclick, h = yclick)
})
})
UI文件:
library(shiny)
shinyUI(
basicPage(
plotOutput("plot", click = "click", height = "400px", width = "400px")
)
)
winston称此问题"状态"累积 - 您不仅要显示当前数据,而且要显示上一个图所产生的东西(最佳了解此信息的地方是在https://www.rstudio.com/resources/videos/coordined-multiped-views-linked-brushing/)
基本想法是创建自己的一组反应值,并在用户单击图时进行更新。在下一次点击之前,它们不会无效,因此您不会获得循环行为。
library(shiny)
shinyApp(
shinyUI(basicPage(plotOutput("plot", click = "click"))),
function(input, output) {
click <- reactiveValues(x = NULL, y = NULL)
observeEvent(input$click, {
click$x <- input$click$x
click$y <- input$click$y
})
output$plot <- renderPlot({
plot(1, 1)
abline(v = click$x, h = click$y)
})
}
)