2017-06-08 109 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