Shiny无法在不同的选项卡面板上显示不同的“webGLOutput”?

时间:2016-04-10 03:26:53

标签: r plot tabs shiny rgl

我正在尝试在不同的选项卡面板中显示不同的3D绘图,但我发现3D绘图仅显示在第一个选项卡面板中。根据{{​​3}},plotOutput的参数outputId应该是唯一的,在我的情况下,ID在所需的闪亮应用中是唯一的。我的应用程序的一些行如下:

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)
  })

})

由于有数百行,我无法发布所有行。

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

1 个答案:

答案 0 :(得分:3)

您似乎正在使用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)
  )

})

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