You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

R Shiny App使用udpipe时触发inherits(x, "character") is not TRUE错误求助

解决Shiny App中inherits(x, "character") is not TRUE错误

我帮你梳理并修复这个问题,咱们一步步来:

错误根源拆解

你遇到的报错主要来自几个代码细节问题:

  • Reactive对象调用漏了括号:Dataset是响应式函数,必须通过Dataset()才能获取它返回的文本内容
  • 文件读取路径错误:fileInput返回的对象里,实际文件路径存在于datapath属性,不能直接用input$file1读取
  • 函数拼写错误:R内置的读取行函数是readLines(注意大写L),不是readlines
  • 缺失依赖库:str_replace_all属于stringr包,没加载的话会找不到这个函数
  • 注释结果类型不兼容:udpipe_annotate返回的是AnnotatedDataFrame,必须转为普通data.frame才能被renderDataTable识别
  • 空值未处理:没上传文件时直接执行注释逻辑会触发报错

修正后的完整代码

ui.R(仅补全闭合标签,核心逻辑不变)

shinyUI(fluidPage(
  # Today's date
  dateInput("date6", "Date:", startview = "decade"),
  # Current time
  h2(textOutput("CurrentTime")),
  # Application title
  titlePanel("UDPipe Text Analysis"),
  # Sidebar layout
  sidebarLayout(
    sidebarPanel(
      # File upload input
      fileInput("file1", "Choose Text File"),
      # Horizontal divider
      tags$hr(),
      # POS selection checkbox
      checkboxGroupInput("upos",
                         label = h4("Parts Of Speech to Show:"),
                         c("Adjective" = "ADJ", 
                           "Propernoun" = "PROPN", 
                           "Adverb" = "ADV", 
                           "Noun" = "NOUN", 
                           "Verb"= "VERB"),
                         selected = c("ADJ","NOUN","VERB"),
                         width = '100%')
    ),
    mainPanel(
      tabsetPanel(type = "tabs",
                  tabPanel("Overview",
                           h4(p("Who deveoped this App")),
                           p("This app supports only text files. ", align = "justify"),
                           h4("Pupropse of this app"),
                           h4("what precaution to take") ),
                  tabPanel("Annotate", dataTableOutput('Annotate'))
      )
    )
  )
))

server.R(关键修改都在这里)

library(shiny)
library(udpipe)
library(stringr) # 加载str_replace_all所需的依赖库

# 优化:把模型加载放在外面,避免每次渲染表格重复加载
english_model <- udpipe_load_model("./english-ud-2.0-170801.udpipe")

shinyServer(function(input, output) {
  
  Dataset <- reactive({
    if (is.null(input$file1)) { # 修正判断对象:input$file1而非input$file
      return(NULL)
    } else {
      # 修正:用readLines(大写L),读取正确的文件路径datapath
      Data <- readLines(input$file1$datapath)
      Data <- str_replace_all(Data, "<.*?>", "")
      return(Data)
    }
  })
  
  output$Annotate <- renderDataTable({
    # 先判断是否有上传文件,避免空值报错
    if (is.null(Dataset())) {
      return(data.frame(Message = "请上传文本文件以查看注释结果"))
    }
    # 修正:调用Dataset()获取文本内容,而非直接用Dataset
    x <- udpipe_annotate(english_model, x = Dataset())
    # 修正:转为普通data.frame适配datatable
    as.data.frame(x)
  })
  
})

额外优化建议

  • 刚才把模型加载放在了shinyServer外面,这样App启动时只加载一次模型,大幅提升后续操作的响应速度
  • 空状态下返回了提示文本,用户体验会更友好,你也可以根据需要改成英文提示

内容的提问来源于stack exchange,提问作者Balaji Venky

火山引擎 最新活动