【发布时间】:2016-10-20 20:20:36
【问题描述】:
Shiny 中的反应式表达式将更改传播到需要去的地方。我们可以使用isolate 抑制这种行为,但是我们可以抑制基于我们自己的逻辑表达式传播的更改吗?
我给出的例子是一个简单的散点图,我们用abline在用户点击的地方画了一个十字准线。不幸的是,Shiny 认为结果是一个新的情节,我们的点击值被重置为NULL... 这又被视为对要像往常一样传播的值的更新。情节被重绘,NULL 被传递给abline 的两个参数。
我的技巧(在下面注释掉)是在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)
})
})
用户界面文件:
library(shiny)
shinyUI(
basicPage(
plotOutput("plot", click = "click", height = "400px", width = "400px")
)
)
【问题讨论】:
-
由于您的
if语句似乎可以在此示例中执行您想要的操作,因此最好提供一个示例说明它何时不起作用 -
renderPlot有点静态,要做你想做的事,你应该使用更高级的库,如rCharts或highcharter只调用这些更改 -
喜欢this?
-
@Hack-R 我认为我的修复导致绘制同一件事两次的事实非常糟糕!
-
@Pork Chop 感谢您的建议。我正在以其他方式实现我的默认交互式图形......我只是想提供一个闪亮的替代方案。