R Shiny报错:must be a numeric 问题排查求助
解决Shiny结合frailtypack时的「must be a numeric」错误
我帮你排查出了问题的根源,其实是Shiny输入控件的类型和frailtyPenal函数的参数要求不匹配导致的:
问题原因
Shiny的sliderInput控件默认返回的是**数值型(numeric)数据——哪怕你设置了步长为1,返回的也是类似10.0这种带小数的数值,但frailtypack包的frailtyPenal函数中,nb.int参数要求传入的是整数型(integer)**数据,这种类型不匹配就触发了「must be a numeric」的错误提示(这个提示有点误导,实际是需要整数类型)。
解决方案
只需要把input$nb转换成整数类型再传给nb.int参数即可,用as.integer()函数就能轻松实现。
修改后的完整代码
library(shiny) library(frailtypack) data("readmission", package = "frailtypack") ui <- fluidPage( sidebarPanel( sliderInput("nb", h5("Number of time intervals :"), min = 1, max = 20, value = 10) ), mainPanel( verbatimTextOutput("mod") ) ) server <- function(input, output) { output$mod <- renderPrint({ # 关键修改:将input$nb转换为整数类型 model <- frailtyPenal(Surv(time,event)~cluster(id)+ sex + dukes, data=readmission, hazard = "Piecewise-per", nb.int = as.integer(input$nb)) print(model) }) } shinyApp(ui, server)
验证小技巧
如果你想确认输入类型,可以在renderPrint里临时加入str(input$nb),运行后会看到控制台输出 num 10(说明是数值型),转换后再检查就是 int 10(整数型),完全符合函数的参数要求。
内容的提问来源于stack exchange,提问作者Alexis
相关产品推荐
相关产品推荐

