2017-06-08 163 views
0

我曾尝试没有成功使用下面的代码来创建切换,能够剧情显示:在RGL使用toggleWidget闪亮

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.

长度特征向量

我也尝试了ids变量toggleWidget的一些不同的变化,其成功水平相似。 Shiny中的rgl的例子似乎很少。

在Shiny中使用rgl中的toggleWidget的正确方法是什么?

+0

你不应该把'toggleWidget'放在'renderPlaywidget'里面。后者旨在保存“playWidget”,而不是其他任何东西。然而,我不知道Shiny是否足够知道你应该做什么。你会如何包含HTML代码? – user2554330

+0

我想我以前的评论是错误的,对不起!不知道问题是什么。 – user2554330

回答

1

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

但是,这不足以让你的例子工作。我还没有完全调试它,但我可以看到以下内容:

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

杰出。这与'0.98.10'完美配合。感谢您提供错误修复。 – hfisch