我尝试使用plotlyProxy()
功能(Documented here)来允许优秀应用程序的用户以最小的延迟添加和删除跟踪。
添加跟踪被证明是相对简单的,但是我很难弄清楚如何按名称删除跟踪 (我只看到了按跟踪编号删除的文档示例)。
是否有办法使用plotlyProxy()
按名称删除跟踪?
如果没有,是否有一种方法可以解析输出对象,以导出与给定名称关联的跟踪号?
我可以使用标准模式索引在交互式R会话中确定给定名称的关联跟踪号,但是当我试图在一个出色的应用程序中应用相同的逻辑时,我得到一个错误:* “$.shinyoutput中的错误:不允许从shinyoutput对象阅读对象。"*
下面是一个最小的例子,没有一个观察者看到Remove
按钮实际上是工作的,但是他们应该给予我试图实现的功能的想法。
library(shiny)
library(plotly)
ui <- fluidPage(
textInput("TraceName", "Trace Name"),
actionButton("Add","Add Trace"),
actionButton("Remove","Remove Trace"),
plotlyOutput("MyPlot")
)
server <- function(input,output,session) {
## Creaing the plot
output$MyPlot <- renderPlotly({
plot_ly() %>%
layout(showlegend = TRUE)
})
## Adding traces is smooth sailing
observeEvent(input$Add,{
plotlyProxy("MyPlot", session) %>%
plotlyProxyInvoke("addTraces", list(x = rnorm(10),y = rnorm(10),
type = "scatter",mode = "markers",
name = input$TraceName))
})
## Ideal Solution (that does not work)
observeEvent(input$Remove,{
plotlyProxy("MyPlot", session) %>%
plotlyProxyInvoke("deleteTraces", input$TraceName)
})
## Trying to extract tracenames throws an error:
## Warning: Error in $.shinyoutput: Reading objects from shinyoutput object not allowed.
observeEvent(input$Remove,{
TraceNames <- unlist(lapply(seq_along(names(output$MyPlot$x$attrs)),
function(x) output$MyPlot$x$attrs[[x]][["name"]]))
ThisTrace <- which(TraceNames == input$TraceName)
plotlyProxy("MyPlot", session) %>%
plotlyProxyInvoke("deleteTraces", ThisTrace)
})
}
shinyApp(ui, server)
3条答案
按热度按时间3ks5zfa01#
编辑使用
plotlyProxy
:更新@SeGa,感谢您添加删除同名轨迹的支持!
最后,我找到了一个通过修改answer来实现预期行为的解决方案。trace.name单击remove-button后,我使用
onRender
从library(htmlwidgets)
接收www.example.com/trace.indexMap:结果:
这方面的有用文章:
shiny js-events
绘图添加轨迹
绘图删除轨迹
采用
plotlyProxy
的闪亮模块解决方案:以前的解决方案避免
plotlyProxy
:我是通过这个问题来到这里的。
您明确要求使用
plotlyProxy()
,因此我不确定这是否对您有帮助,但这里有一个变通方案,通过更新提供给plot_ly()
的数据而不是使用plotlyProxy()
来实现预期行为:but5z9lq2#
找不到痕迹的names属性,我想
deleteTrace
函数不能按名称删除,它只是根据引用按索引删除。我尝试为Shiny实现一些东西,它在 Dataframe 中记录添加的跟踪,并为它们添加索引。对于删除,它将给定的名称与 Dataframe 匹配,并将这些索引提供给
plotlyProxyInvoke
的delete方法,但它无法正常工作。* 也许有人可以添加一些见解,解释为什么会发生这种情况?*一个问题似乎是图例,删除后显示错误的标签,我不认为plotly和R/shiny保持相同的痕迹索引,这导致奇怪的行为。所以这个代码肯定需要一些修复。
我包含了一个小的JQuery片段,它记录了绘图的所有跟踪并将它们发送到
reactiveVal()
。有趣的是,它与侦听AddTraces
事件的data.frame不同,绘图中总是有一个剩余跟踪。vom3gejh3#
看起来Plotly.D3方法已经过时了,在上面的代码中不再起作用。我可以用下面的代码复制一个简单的解决方案。