Shiny 不能在不同的选项卡面板上显示不同的"webGLOutput"?

Shiny can not display different "webGLOutput" on different tab panels?

我试图在不同的选项卡面板中显示不同的 3D 绘图,但我发现 3D 绘图仅显示在第一个选项卡面板中。根据 this postplotOutputs 参数 outputId 应该是唯一的,在我的例子中,ID 在 entail shiny app 上是唯一的。我的应用程序的一些行如下:

ui.R
shinyUI(fluidPage(    
  mainPanel(
    tabsetPanel(
      tabPanel("VWC", webGLOutput("VWC3DPlot")), 
      tabPanel("TEMP", webGLOutput("TEMP3DPlot"))
    )
  )
))


server.R
shinyServer(function(input, output) {

    # set dir;
    dataDir <- "C:/Users/PH/Desktop/data/DATA/"

    # store dataframe of attribute to list;
    dfList <- readIntoDF(dataDir) # readIntoDF() is function that return a list

    # extract dataframe from list
    dfVWC <- dfList$VWC
    dfTEMP <- dfList$TEMP

    # processing of dataframes
    dfVWC <- transformDF(dfVWC)
    dfTEMP <- transformDF(dfTEMP)    

    # prepare grid for kriging;
    grd <- expand.grid(x=seq(from=0, to=600, by=200),
                       y=seq(from=0, to=500, by=200))

    # Kriging;
    dfVWCkrige <- krigingFun(dfVWC, grd)
    dfTEMPKrige <- krigingFun(dfTEMP, grd)

    krigeList <- list("VWCKrige" = dfVWCkrige, "TEMPKrige" = dfTEMPKrige)

    return(krigeList)
  })  # end of dataInput


  ### create cubs;
   output$VWC3DPlot <- renderWebGL({
     createCubes(dataInput()$VWCKrige) # createCubes() is a function that use output of kriging and shinyrgl pkg to create cubes;
   })

  output$TEMP3DPlot <- renderWebGL({
    createCubes(dataInput()$TEMPKrige)
  })

})

因为有数百行,我无法post全部。

根据this post,我更新了shiny的版本,但对我的情况没有影响。

您似乎在使用 shinyRGL。不要用它,rgl有你需要的。这是一个对我有用的例子:

ui.R:

library(shiny)

shinyUI(fluidPage(
  mainPanel(
  tabsetPanel(
    tabPanel("red",
      rglwidgetOutput('thewidget1')),
    tabPanel("green",
      rglwidgetOutput('thewidget2'))
  ))
))

server.R:

library(shiny)
library(rgl)

options(rgl.useNULL = TRUE)
shinyServer(function(input, output, session) {

  x <- rnorm(100)
  y <- 2*rnorm(100)
  z <- 10*rnorm(100)
  open3d()
  plot3d(x, y, z, col = "red")
  scene1 <- scene3d()
  plot3d(z, y, x, col = "green")
  scene2 <- scene3d()
  rgl.close()

  save <- options(rgl.inShiny = TRUE)
  on.exit(options(save))

  output$thewidget1 <- renderRglwidget(
    rglwidget(scene1)
  )

  output$thewidget2 <- renderRglwidget(
    rglwidget(scene2)
  )

})

顺便说一句,如果您按要求发布了一个可重现的示例,我们会更快到达这里。