【问题标题】:Having trouble getting 2x2 table Mosaic Plot to display in R-shiny无法在 R-shiny 中显示 2x2 表格马赛克图
【发布时间】:2019-06-18 08:24:02
【问题描述】:

raw data 我正在创建一个 Rshiny 应用程序,它允许用户上传一些临床数据,并根据他们打开的选项卡查看几个不同的图。其中包括折线图、饼图和马赛克图。我可以根据上传的数据和用户输入查看折线图和饼图,但无法显示马赛克图。我收到一条错误消息,提示“找不到对象‘输入’。”

我尝试在 R 中使用 ggmosaic(geom_mosaic) 和 structable 包来显示绘图。在我感兴趣的数据表中,有 5 列:REF(2x2 列联表的参考方法结果,它是二进制的——POS 或 NEG 临床结果),结果(4 个差异值:真阳性、假阴性、真阴性,假阳性)、值(每个结果的患者数量)、样本类型(患者样本的类型——NS、NP、总体是此列的 3 个可能数据值)和比较器(POS 或 NEG 临床结果)。在括号中,我已经包含了人们对每一列的期望值的类型。此外,对于我的 R 闪亮马赛克应用程序,我在左侧有几个用户输入,一旦用户选择它们就可以构建应用程序:为 REF 列选择输入,为样本类型列选择输入,选择输入为比较器。我在服务器函数中编写了代码,该函数使用这 3 个输入来构建马赛克图。

编辑:我已在顶部标题为“原始数据”的链接中附加了我的原始数据。

马赛克图数据表 - 从饼图中获取数据,但以#不同的视觉格式显示它

  MosaicDF <- reactive({
    
    #display mosaic 
    Mosaic_filtered <- select(PieData_extracted(),-c(3,5:7))
    
    
    
    #data transformation
    names(Mosaic_filtered)[1]<-"REF"
    Mosaic_filtered$SampleType <- "NS"
    Mosaic_filtered$Comparator <- c("POS","NEG","NEG","POS")
    Mosaic_filtered$REF <- c("POS","POS","NEG","NEG")
    Mosaic_filtered$F2 <- factor(as.character(Mosaic_filtered$Value))
    MYRaw <- Mosaic_filtered[rep(rownames(Mosaic_filtered),as.numeric(as.character(Mosaic_filtered$F2))), ]
    MYRaw <- as.data.frame(MYRaw)
    
    #update select input for mosaic plot
    updateSelectInput(session, inputId = 'REF', label = 'Select Reference column',
                      choices = names(MYRaw), selected = "")
    updateSelectInput(session, inputId = 'SampleType', label = 'Select Sample Type column',
                      choices = names(MYRaw), selected = "")
    updateSelectInput(session, inputId = 'Comparator', label = 'Select Comparator column',
                      choices = names(MYRaw), selected = "")
    
    return(MYRaw)
    
  })


 #display mosaic plot
  
  output$mosaic <- renderPlot({
    
    ggplot(data=MosaicDF())+geom_mosaic(aes(x=product(input$REF,input$Comparator),fill=input$REF))+labs(x="Comparator",y="REF")
  })
  
}

我正在获取数据表(从中构建马赛克图)以显示为输出,但马赛克图本身不会显示。它说:

“错误:找不到对象输入”。

饼图数据表和饼图本身确实出现在此图的选项卡上。 (在 R shiny 应用程序中,每个不同的绘图都有 3 个选项卡,用户可以从中选择任何一个,从下拉菜单中选择一些输入,并允许根据输入自动构建应用程序)。

我想知道是否有办法修改我的反应数据表或绘图本身的代码 - 我应该更改 ggplot 的代码,还是为 Rshiny 格式使用不同的镶嵌包?

【问题讨论】:

  • 您好。您能否分享您的数据或以其他方式创建可重现的示例?我知道你试图描述你在做什么,但我们很难重现。见这里:stackoverflow.com/help/minimal-reproducible-example
  • 我在上面的描述中粘贴了一个链接,标题为“原始数据”,其中包含我的数据。
  • 人们喜欢尝试运行你的代码并尝试改变不同的东西。在图像中包含数据并没有真正的帮助。
  • 我无法将我的数据作为 Excel 文件上传,但我很乐意通过电子邮件分享。

标签: r ggplot2 shiny shiny-reactivity r-mosaic


【解决方案1】:

如果不提供由数据和代码组成的示例,人们可以复制和运行以可靠地重现您的错误,那么很难说是哪里出了问题。

但是,这里有一个闪亮的应用示例,它基于geom_mosaic() 帮助页面中的 Titanic 示例。

library(ggmosaic)
library(rlang)
library(shiny)

ui <- fluidPage(

    sidebarLayout(
        sidebarPanel(
            selectInput("REF", "REF", "Survived"), 
            selectInput("Comparator", "Comparator", c("Class", "Sex", "Age"))
        ),

        mainPanel(
           plotOutput("old_mosaic"), 
           plotOutput("new_mosaic")
        )
    )
)

server <- function(input, output) {
    titanic_data <- reactive({
        data(Titanic)
        titanic <- as.data.frame(Titanic)
        titanic$Survived <- factor(titanic$Survived, levels=c("Yes", "No"))
        titanic
    })

    output$old_mosaic <- renderPlot({
        ggplot(data = titanic_data()) + 
            geom_mosaic(aes(weight = Freq, x = product(input$REF, input$Comparator), fill = input$REF)) + 
            labs(title = "Old Way")
    })

    output$new_mosaic <- renderPlot({
        ggplot(data=titanic_data()) +
            geom_mosaic(aes(weight = Freq, x = product(!!sym(input$REF), !!sym(input$Comparator)), fill = !!sym(input$REF))) + 
            labs(title = "New Way")
    })
}

shinyApp(ui, server)

生成第一个图的代码类似于您的 ggplot 代码,它尝试按原样使用 input$id(s)。在我的机器上,第一个图会产生您描述的错误,在其他情况下,这种方法似乎会产生same error

当时的解决方案是用aes_string() 代替aes()。但是,在这里我们不应该这样做,因为aes_string() 已被软弃用;更重要的是,我们不能只使用aes_string(),因为我们仍然需要与product() 元素抗衡。

返回到示例应用程序,请注意第二个图的渲染没有问题。在这段代码中,我使用了new idiomatic way,它将输入字符串转换为符号,然后取消引用。

因此,如果我是正确的,并且这是您的错误的根源,那么您应该在您的 ggplot 代码中用 !!sym() 包装每个 input$id

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-07
    • 1970-01-01
    • 1970-01-01
    • 2021-05-31
    • 2021-01-09
    • 1970-01-01
    相关资源
    最近更新 更多