4

rCharts我在我的应用程序中使用时遇到了一个问题Shiny。我动态生成 1-3tabPanels个(取决于用户的选择),并在每个中呈现一个图。绘图可能有两种类型:简单(带有图形库)或 rCharts(带有morris)。每次用户更改他的输入时,整体tabsetPanel都会在组件内呈现。(对于简单绘图或rCharts)uiOutput的类型是在渲染 a 时定义的,因此绘图确实具有适当的环境。ui outputplotOutputshowOutputtabPanel

问题是:简单的绘图(带有图形、ggplot2 等)确实可以正常工作 - 它们在tabPanel. 但是,当我使用应用程序并要显示 2 或 3 个 rCharts 时,碰巧有一个图表没有显示- 几乎没有显示(见下图)。当然,简单的情节不会出现这样的问题。

我试图让输出大小固定,大小灵活,但问题仍然存在。我有各种 R 和库如下:

> R.Version()$version.string
[1] "R version 3.0.1 (2013-05-16)"
> packageVersion("Shiny")
[1] ‘0.7.0’
> packageVersion("rCharts")
[1] ‘0.3.51’

非常感谢您的任何建议。

rCharts 工作正常:

在此处输入图像描述

rCharts 无法显示正常:

在此处输入图像描述

编辑:我的代码如下:

用户界面

library(shiny)
library(Epi)

shinyUI(pageWithSidebar(  
  headerPanel("Header"),  

  sidebarPanel(        
    checkboxInput(inputId = "checkboxInputx", label = "function: x", value = TRUE),
    checkboxInput(inputId = "checkboxInputxpower2", label = "function: x^2", value =     FALSE),
    checkboxInput(inputId = "checkboxInput2x", label = "function:  2x", value = FALSE),

    actionButton("gobutton","GO!")
   ),

  mainPanel(    
    radioButtons("plottypechoice", "Choose plot type", c("simple", "rCharts")),    
    uiOutput("plotpanelcontent")
  )   
))

服务器

library(shiny)
library(rCharts)
library(Epi)
library(reshape2)

# build data frame 
x <- 1:100
df <- data.frame(x, x^2, 2*x)
names(df) <- c("x", "xpower2", "2productx")


shinyServer(function(input, output) {

  # generate tabsetPanel with tabPlots with plot of selected type 
  output$plotpanelcontent <- renderUI({ 

    if(input$gobutton != 0){


        # collect tab names 
        tab.names <- vector()
        if(input$checkboxInputx) tab.names <- c(tab.names, "x")
        if(input$checkboxInputxpower2) tab.names <- c(tab.names, "xpower2")
        if(input$checkboxInput2x) tab.names <- c(tab.names, "2productx")
        print(tab.names)

        # render tabs
        tabs <- lapply(tab.names, function(tab.name){ 
          # define tabPanel content depending on plot type selection 
          if(input$plottypechoice == "simple")
            tab <- tabPanel(tab.name, plotOutput(paste0("simpleplot", tab.name)))
          else
            tab <- tabPanel(tab.name, showOutput(paste0("rchartplot", tab.name), "morris"))
          return(tab)
        })  
        return(do.call(tabsetPanel, tabs))
    }
  })  


  # Render simple plots 
  output$simpleplotx <- renderPlot({ 
    print(plot(df[,1], df[,1]))
    plot(df[,1], df[,1]) 
  })
  output$simpleplotxpower2 <- renderPlot({ 
    print(plot(df[,1], df[,2]))
    plot(df[,1], df[,2])   
  })
  output$simpleplot2productx <- renderPlot({ 
    print(plot(df[,1], df[,3]))
    plot(df[,1], df[,3])   
  })


  # Render rCharts 
  output$rchartplotx <- renderChart({ 
    plot <- mPlot(x="x", y="x", type = "Line", data = df)
    plot$set(dom = "rchartplotx")
    return(plot)
  })
  output$rchartplotxpower2 <- renderChart({ 
    plot <- mPlot(x="x", y="xpower2", type = "Line", data = df)
    plot$set(dom = "rchartplotxpower2")
    return(plot)
  })
  output$rchartplot2productx <- renderChart({ 
    plot <- mPlot(x="x", y="2productx", type = "Line", data = df)
    plot$set(dom = "rchartplot2productx")
    return(plot)
  })
}) 

更新:

我已请morris.js 库的作者Olly Smith提出解决方案,我收到了以下回复:

当图表未显示在屏幕上时,Morris 无法正确绘制图表。在选项卡式应用程序中使用 Morris 时,您需要在选项卡选择更改时重新绘制活动图表。每个 Morris.Line/Bar/Donut 构造函数返回的图表对象都有一个 redraw() 方法,您可以使用它来执行此操作。不幸的是,它目前没有文档记录,但它现在是 API 的稳定部分,因此可以安全使用。

更新2:

我遵循了RamnathShiny的建议并更新了rCharts库版本:

> packageVersion("Shiny")
[1] ‘0.8.0’
>  packageVersion("rCharts")
[1] ‘0.3.53’

并在重新启动 R 会话后运行代码。不幸的是,情节现在似乎以更奇怪的方式表现。按以下顺序执行操作后:

  1. 设置:“函数:x”,“rCharts”,GO [OK],

  2. 添加:“功能:x^2”[参见帖子下方的“not_ok_1”图片],

  3. 添加:“功能:2x”[参见帖子下方的“not_ok_2”图片]。

我收到的绘图可视化如下:

  1. 好的 在此处输入图像描述

  2. “not_ok_1”图像 在此处输入图像描述

  3. “not_ok_2”图像 在此处输入图像描述

4

0 回答 0