R shiny basic ANOVA on imported data producing this error: Error in model.frame.default: invalid type (NULL) for variable 'input$var3'

R shiny basic ANOVA on imported data producing this error: Error in model.frame.default: invalid type (NULL) for variable 'input$var3'

我对 R 和 R shiny 非常陌生,我目前正在开发一个基本的 shinyapp,它允许用户导入数据集,然后 运行 使用 selectInputs 对数据进行方差分析以确定自变量和因变量。但是,每当我尝试执行方差分析函数时,都会收到此错误:

警告:model.frame.default 中的错误:变量 'input$var3'

的类型无效 (NULL)

我也收到了这个错误:

警告:对比错误<-:对比只能应用于具有 2 个或更多水平的因素

我不明白为什么我会收到此错误,大多数解释仅指 R 中的此错误,而不是 R shiny。同样,我是初学者,所以我的代码可能非常难看。非常感谢任何帮助!

ui <- fluidPage(theme = shinytheme("cosmo"),

titlePanel("Stats App"),

sidebarLayout(
    sidebarPanel(
        tabsetPanel(type = "tab", 
                    tabPanel("SCI",
                             
                        fileInput("file1", "Insert File", multiple = TRUE, accept = c("text/csv", "text/comma-separated-values, text/plain", ".csv")),
                            
                        selectInput("statChoice", "Choose Stats", c("None" = "None", "ANOVA 0 w/in 1 btw" = "A1btw", "ANOVA 0 w/in 2 btw" = "A2btw")),
                        
                            conditionalPanel("input.statChoice == 'A2btw'",
                                uiOutput("ind1"),
                                uiOutput("ind2"),
                                uiOutput("dep1")),
                        
            )
        )
    ),
   
    mainPanel(
       tabsetPanel(type = "tab",
                   tabPanel("Data", 
                            tableOutput("fileData")),
                   tabPanel("Summary Statistics",
                            verbatimTextOutput("stats")),
                   tabPanel("Graphs"))
    )
)
)


server <- function(input, output) {

fileData <- eventReactive(input$file1,{
    read.csv(input$file1$datapath, header = TRUE, sep = ",", dec = ".", comment.char = "")
})

output$fileData <- renderTable(
    fileData()
)

vars <- reactive({
    names(fileData())
})

output$ind1 <- renderUI({
    selectInput("var1", "Independent 1", choices = vars())
})

output$ind2 <- renderUI({
    selectInput("var2", "Independent 2", choices = vars())
})

output$dep1 <- renderUI({
    selectInput("var3", "Dependent 1", choices = vars())
})

output$stats <- renderText({
    summary(aov(input$var3 ~ as.factor(input$var1) + as.factor(input$var2), data = fileData()))
})
}


shinyApp(ui = ui, server = server)

您的应用中存在多个问题。

  1. 只要您的输入变量还没有被初始化,即当您启动您的应用程序并且在您选择“统计”之前它们是 NULL。这就是您收到警告 Warning: Error in model.frame.default: invalid type (NULL) for variable 'input$var3' 的原因。为了防止这种情况,您可以添加例如req(input$var3), ...

  2. 选择“统计”后,您的输入变量将被初始化。但是,您的输入变量只是变量的名称,即它们是字符向量。你正在尝试做的是例如aov("mpg" ~ as.factor("mpg") + as.factor("mpg"), data = mtcars)。正如您可以在 R 控制台中检查的那样,这将不起作用。要完成这项工作,您必须将输入变量转换为“符号”。我下面的方法只是将公式设置为字符串,我通过 as.formula.

    将其转换为公式
  3. renderText 不适用于模型输出。为此使用 renderPrint.

试试这个:

  output$stats <- renderPrint({
    req(input$var1)
    req(input$var2)
    req(input$var3)
    fmla <- paste(input$var3, "~",
                  "as.factor(", input$var1, ")", "+",
                  "as.factor(", input$var2, ")")
    summary(aov(as.formula(fmla), data = fileData()))
  })