我尝试使用以下代码创建可切换的绘图显示但未成功:
library(shiny)
library(rgl)
ui <- (fluidPage(
checkboxInput("chk", label = "Display", value = TRUE),
playwidgetOutput("control"),
rglwidgetOutput("wdg")
))
server <- function(input, output, session) {
options(rgl.useNULL = TRUE)
save <- options(rgl.inShiny = TRUE)
on.exit(options(save))
open3d()
plot3d(rnorm(100), rnorm(100), rnorm(100))
scene <- scene3d()
rgl.close()
plot3d(scene)
output$wdg <- renderRglwidget({
rglwidget(controllers = c("control"))
})
output$control <- renderPlaywidget({
toggleWidget("wdg", respondTo = "chk",
ids = as.integer(names(scene$objects[1])))
})
}
shinyApp(ui = ui, server = server)
使用当前代码设置,我收到以下错误:
Error: length(buttonLabels) == length(components) is not TRUE
据我所知,toggleWidget
包裹playwidget
的方式,似乎buttonLabels
和components
都是长度为1的字符向量。< / p>
我还为ids
的{{1}}变量尝试了许多不同的变体,并取得了类似的成功。 Shiny中toggleWidget
的例子似乎很少见。
在rgl
中使用闪亮的toggleWidget
的正确方法是什么?
答案 0 :(得分:1)
您看到的特定错误消息是由于rgl
中的错误:当链接到Shiny控件时,您需要将toggleWidget
标签明确设置为character()
。还有另一个相关的bug
到Shiny使用的复选框。这两个错误都已修复。
但是,这还不足以使您的示例发挥作用。我还没有完全调试它,但我可以看到以下内容:
scene
中保存了场景,因此应将其传递给rglwidget()
。plot3d
来电的结果,然后在toggleWidget
来电中使用这些值。我不确定哪些会导致您的脚本失败,但新的demo(shinyToggle)
(如下所示)可以正常工作。
library(shiny)
library(rgl)
open3d(useNULL = TRUE)
ids <- plot3d(rnorm(100), rnorm(100), rnorm(100))[1]
scene <- scene3d()
rgl.close()
ui <- (fluidPage(
checkboxInput("chk", label = "Display", value = FALSE),
playwidgetOutput("control"),
rglwidgetOutput("wdg")
))
server <- function(input, output, session) {
options(rgl.useNULL = TRUE)
save <- options(rgl.inShiny = TRUE)
on.exit(options(save))
output$wdg <- renderRglwidget({
rglwidget(scene, controllers = c("control"))
})
output$control <- renderPlaywidget({
toggleWidget("wdg", respondTo = "chk",
ids = ids)
})
}
if (interactive())
shinyApp(ui = ui, server = server)