开发一个将IRT分析从MIRT包中提取到表格和绘图格式的Shiny App

vc6uscn9  于 2023-04-09  发布在  其他
关注(0)|答案(1)|浏览(135)

我是Shiny的新用户,正在尝试在 Jmeter 板中构建一个应用程序,它可以做三件事。
1.接受应用程序用户的csv数据文件-这似乎工作正常,因为我在应用程序中收到一条消息,“上传完成”
1.使用MIRT包基于数据文件生成绘图输出
1.使用mirt包基于数据文件生成表输出。
当我上传一个csv数据文件时,我在图和表的输出中得到以下错误:
错误:参数的长度为零
任何帮助将不胜感激!
下面是我的代码:

ui <- fluidPage(
   titlePanel(p("Let's Analyze with IRT!", style = "color:teal")),
  sidebarLayout(
    sidebarPanel(
     h3("Upload Your Data"), 
      h5(em("Remember your data should be a matrix with dichotomous responses of 0 or 1 stored in a .csv file")),
     fileInput(inputId = "filedata",
          label = "Choose csv file",
          accept = c(".csv")), 
                 p("Made with", a("Shiny",
                 href = "http://shiny.rstudio.com")),
                 img(src = base64enc::dataURI(file = xxx, 
                                              mime = "image/png"))),
  mainPanel("ICC Plot and Item Parameter Table",
           tableOutput("irtPT")
            )
  )
)

server <- function(input, output){
  mydata <- reactive({
    req(input$filedata)
    read.csv(input$filedata$datapath,  header = FALSE)
  })

  output$irtPT <- renderTable({
    unimodel <- mirt.model("latent = ")

    modT2 <- mirt::mirt(data = mydata,
               model = unimodel,
               itemtype = "Rasch",
               SE = TRUE)

    coef.rasch3 <- coef(modT2, IRTpars=TRUE, simplify=TRUE)

    items.rasch3 <- as.data.frame(coef.rasch3$items)

    IR3e <- items.rasch3 %>% select(-c("g", "u"))

    colnames(IR3e)[1] <- "Item Discrimination Parameter"
    colnames(IR3e)[2] <- "Item Location Parameter"

    print(IR3e)
  }, rownames = TRUE)
 }

shinyApp(ui = ui, server = server)
f4t66c6m

f4t66c6m1#

欢迎来到Stack Overflow。感谢您包含您的代码,但请注意,为了让人们尽可能容易地帮助您,您应该使您的代码尽可能小,并确保它可以在其他人的计算机上工作(可能没有您的文件等)。这可能需要一些练习:)在这种情况下,您的代码立即对我来说崩溃了,因为您有一个img(),我的计算机上没有,所以最好完全忽略它。请参阅下面的示例,并注意库调用第一:

library(shiny)
ui <- fluidPage(
    titlePanel(p("Let's Analyze with IRT!", style = "color:teal")),
    sidebarLayout(
        sidebarPanel(
            h3("Upload Your Data"), 
            h5(em("Remember your data should be a matrix with dichotomous responses of 0 or 1 stored in a .csv file")),
            fileInput(inputId = "filedata",
                      label = "Choose csv file",
                      accept = c(".csv")), 
            p("Made with", a("Shiny",
                             href = "http://shiny.rstudio.com"))#,
            ## These lines break
            # img(src = base64enc::dataURI(file = xxx, 
            #                              mime = "image/png"))
            ),
        mainPanel("ICC Plot and Item Parameter Table",
                  tableOutput("irtPT")
        )
    )
)

为了回答你的问题,你上传的CSV数据是一个React对象,所以你需要像函数一样调用它。阅读这里了解更多细节:https://shiny.rstudio.com/articles/understanding-reactivity.html
要修复代码,您需要做的就是在mirt()函数中将mydata更改为mydata()。例如,您的服务器函数如下所示:

server <- function(input, output){
    mydata <- reactive({
        req(input$filedata)
        read.csv(input$filedata$datapath,  header = FALSE)
    })
    
    output$irtPT <- renderTable({
        unimodel <- mirt.model("latent = ")
        
        modT2 <- mirt::mirt(data = mydata(),  
                                  # ^ Changed from mydata
                            model = unimodel,
                            itemtype = "Rasch",
                            SE = TRUE)
        
        coef.rasch3 <- coef(modT2, IRTpars=TRUE, simplify=TRUE)
        
        items.rasch3 <- as.data.frame(coef.rasch3$items)
        
        IR3e <- items.rasch3 %>% select(-c("g", "u"))
        
        colnames(IR3e)[1] <- "Item Discrimination Parameter"
        colnames(IR3e)[2] <- "Item Location Parameter"
        
        print(IR3e)
    }, rownames = TRUE)
}

相关问题