[英]Conditional reactivity Shiny
Shiny中的反应性表达式会将更改传播到需要的地方。 我们可以使用isolate
抑制某些行为,但是可以抑制基于我们自己的逻辑表达式传播的更改吗?
我给出的示例是一个简单的散点图,我们在用户单击的位置绘制了一个带abline
的十字准线。 不幸的是,Shiny认为结果是一个新图,并且我们的点击值被重置为NULL
...,这又被视作对要传播的值的更新。 重绘该图,并将NULL
传递给abline
两个参数。
我的技巧(在下面进行注释)是在renderPlot
调用中放置一个条件,该条件仅在click值为non- 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)
})
})
用户界面文件:
library(shiny)
shinyUI(
basicPage(
plotOutput("plot", click = "click", height = "400px", width = "400px")
)
)
温斯顿称此问题为“状态”累积-您不仅要显示当前数据,而且还希望显示以前的绘图生成的内容(了解此问题的最佳位置是https://www.rstudio.com/resources/videos/协同多视图链接画笔/ )
基本思想是创建自己的电抗值集,并在用户单击绘图时更新它们。 在下次单击之前,它们不会失效,因此您不会得到循环行为。
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)
})
}
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.