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




