使用带有Shiny的rgl中的toggleWidget

时间:2017-06-08 21:09:09

标签: r shiny rgl

我尝试使用以下代码创建可切换的绘图显示但未成功:

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的方式,似乎buttonLabelscomponents都是长度为1的字符向量。< / p>

我还为ids的{​​{1}}变量尝试了许多不同的变体,并取得了类似的成功。 Shiny中toggleWidget的例子似乎很少见。

rgl中使用闪亮的toggleWidget的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

您看到的特定错误消息是由于rgl中的错误:当链接到Shiny控件时,您需要将toggleWidget标签明确设置为character()。还有另一个相关的bug 到Shiny使用的复选框。这两个错误都已修复。

但是,这还不足以使您的示例发挥作用。我还没有完全调试它,但我可以看到以下内容:

  • 您正在两次绘制场景。你可能只想绘制一次。
  • 由于您已在变量scene中保存了场景,因此应将其传递给rglwidget()
  • 让ids切换的最安全方法是保存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)