【问题标题】:wilcox.test does not work in shinywilcox.test 在闪亮时不起作用
【发布时间】:2018-09-25 05:34:26
【问题描述】:

我正在尝试构建一个“数据浏览器”闪亮的应用程序,其中包含 DataTables、ggplot2 图表和 wilcox.test 结果。我似乎无法让 wilcox.test 工作。

在闪亮的应用程序之外,一切正常:

dat <- data.frame(outcome=sample(c("died","survived",NA), 20, TRUE),
       cntr=sample(c("hospa","hospb"), 20, TRUE), 
       s=rnorm(20), 
       t=rnorm(20), stringsAsFactors=FALSE)     

wilcox.test(dat$s ~ dat$outcome)

结果:

Wilcoxon 秩和检验

数据:dat$s by dat$outcome W = 25,p 值 = 0.3301 备择假设:真实位置偏移不等于0

在闪亮的应用程序中,下面的代码给出了“错误:分组因子 > 必须恰好有 2 个级别”。 (图表可以正常工作;为了清楚起见,我省略了这些)。

    library(shiny)
    library(dplyr)

    dat <- data.frame(outcome=sample(c("died","survived",NA), 20, TRUE),
       cntr=sample(c("hospa","hospb"), 20, TRUE), 
       s=rnorm(20), 
       t=rnorm(20), stringsAsFactors=FALSE)

    ui <- navbarPage(
          sidebarLayout(
            sidebarPanel(
             selectInput(inputId = "y", 
              label = "Y-axis:",
              choices = c("s"="s", "t"="t"), 
              selected = "s"),
             selectInput(inputId = "z", 
              label = "Color by:",
              choices = c("outcome", "cntr"),
              selected = "outcome")
                  ),

            mainPanel(
             tabsetPanel(id="tabspanel", type = "tabs",
              tabPanel(title = "Wilcox"),
              h4(textOutput(outputId = "p")))
                   )
                  )
                 )

    server <- function(input, output, session) {
                 df <- reactive({
                              data.frame(input$y, input$z)
                          })

                 output$p <- renderText({
                                 wilcox.test(df()[,1] ~ df()[,2])
                                    })

                                              }

    shinyApp(ui=ui, server=server)

如果代码被重写:

    wilcox.test(dat$s, dat$outcome)

那么错误是'错误:'x'必须是数字'。

有人可以帮忙吗?

【问题讨论】:

    标签: r shiny


    【解决方案1】:

    Gregor 的猜测非常准确;以下来自服务器代码的 sn-p:

        dat_subset <- reactive({
            req(input$selected_type) 
             filter(dat, outcome %in% input$selected_type)
              })
    
        output$scatterplot <- renderPlot({
             ggplot(data = dat_subset(), aes_string(x = input$x, y = input$y, color = input$z)) + geom_boxplot() + labs()
              })
    
        output$nsdtable <- DT::renderDataTable({
                DT::datatable(data = dat_subset()[, 1:4], 
                  options = list(pageLength = 10), 
                  rownames = FALSE)
              })
    

    【讨论】:

      【解决方案2】:

      你遇到的问题是这条线

      data.frame(input$y, input$z)
      

      被翻译成类似的东西

      data.frame("s", "outcome")
      

      wicox.text 无法合理处理。您应该改用以下内容

      data.frame(dat[[input$y]], dat[[input$z]])
      

      还有其他一些小问题。请参阅下面的代码以获取完整修复。

      library(shiny)
      library(dplyr)
      
      dat <- data.frame(outcome=sample(c("died","survived",NA), 20, TRUE),
                        cntr=sample(c("hospa","hospb"), 20, TRUE), 
                        s=rnorm(20), 
                        t=rnorm(20), stringsAsFactors=FALSE)
      
      ui <- navbarPage(
        sidebarLayout(
          sidebarPanel(
            selectInput(inputId = "y", 
                        label = "Y-axis:",
                        choices = c("s"="s", "t"="t"), 
                        selected = "s"),
            selectInput(inputId = "z", 
                        label = "Color by:",
                        choices = c("outcome", "cntr"),
                        selected = "outcome")
          ),
      
          mainPanel(
            tabsetPanel(id="tabspanel", type = "tabs",
                        tabPanel(title = "Wilcox",
                        verbatimTextOutput(outputId = "p")))
          )
        )
      )
      
      server <- function(input, output, session) {
        df <- reactive({
          data.frame(dat[[input$y]], dat[[input$z]])
        })
      
        output$p <- renderPrint({
          wilcox.test(df()[,1] ~ df()[,2])
        })
      
      }
      
      shinyApp(ui=ui, server=server)
      

      【讨论】:

      • 我认为你是对的,但奇怪的是 OP 报告绘图等确实有效(大概也依赖于df)。
      • 确实是古玩。我猜 OP 在他的 renderPlotrenderDataTable 语句中直接使用了 dat 。尤其是ggplot2 图表,大多数用户使用aes_string 来选择变量而不是事先过滤列。
      • 这样的话,可以直接做wilcox.test(dat[[input$y]], dat[[input$z]])或者wilcox.test(as.formula(paste(input$y, '~', input$z)), data = dat)或者类似的! (不是批评您的回答。)
      • 谢谢。我不知道wilcox.test 的公式界面。通常,我会尝试使解决方案代码接近原始代码,这样当我发布完整的修复程序时,OP 就不会感到困惑。如果您不介意,我会将此评论添加到我的答案中。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-10
      • 2018-08-14
      • 1970-01-01
      • 1970-01-01
      • 2019-08-01
      • 1970-01-01
      • 2019-01-09
      相关资源
      最近更新 更多