R Shiny中使用selectInput生成直方图报错:'x'必须为数值
R Shiny直方图生成报错:
'x' must be numeric 解决方法 我是R Shiny新手,想要实现用户选择Atchafalaya或Terrebonne时,分别生成对应数据集的soil_organic_carbon_density直方图,但一直收到错误提示'x' must be numeric,推测程序实际执行的是hist(input$select)。
原代码:
library(shiny) library(readr) library(tidyverse) data <- read_csv("Data/DeltaX_Soil_Properties_Fall2020_Spring2021_Fall2021.csv") data2 <- data[!(data$time_marker_sampled=="-9999"),] Atchafalaya_data <- data2[!(data2$basin == "Terrebonne"),] Terrebonne_data <- data2[!(data2$basin == "Atchafalaya"),] ui <- fluidPage( selectInput( inputId = "select", label = "Sections of data", choices = c("Atchafalaya" = "Atchafalaya_data$soil_organic_carbon_density", "Terrebonne" = "Terrebonne_data$soil_organic_carbon_density")), plotOutput(outputId = "hist") ) server <- function(input, output) { output$hist <- renderPlot({ hist(input$select) }) } shinyApp(ui = ui, server = server)
Atchafalaya_data$soil_organic_carbon_density的数值示例:
Atchafalaya_data$soil_organic_carbon_density [1] 0.012 0.017 0.015 0.016 0.005 0.005 0.015 0.015 0.022 0.011 0.009 0.014 0.032 0.031 0.031 0.019 0.029 [18] 0.033 0.012 0.036 0.032 0.035 0.033 0.039 0.037 0.027 0.032 0.024 0.043 0.025 0.025 0.034 0.078 0.028 [35] 0.033 0.032 0.018 0.010 0.012 0.011 0.015 0.012 0.011 0.013 0.011 0.002 0.002 0.004 0.003 0.002 0.002 [52] 0.003 0.020 0.020 0.017 0.021 0.021 0.018 0.022 0.021 0.023 0.011 0.013 0.007 0.007 0.010 0.009 0.006 [69] 0.011 0.008 0.010 0.012 0.009 0.012 0.010 0.008 0.010 0.012 0.012 0.014 0.010 0.014 0.013 0.010 0.013 [86] 0.012 0.011 0.017 0.011 0.009 0.010 0.018 0.018 0.020 0.010 0.012 0.015 0.011 0.020 0.019 0.019 0.025 [103] 0.031 0.029 0.013 0.020 0.020 0.016 0.006 0.016 0.010 0.035 0.014 0.015 0.008 0.005 0.004 0.005 0.004 [120] 0.004 0.005 0.007 0.006 0.006 0.006 0.005 0.004 0.014 0.017 0.021 0.009 0.009 0.015 0.001 0.004 0.003 [137] 0.003 0.002 0.003 0.008 0.009 0.007 0.008 0.006 0.009 0.012 0.006 0.012 0.004 0.005 0.007 0.019 0.011 [154] 0.012 0.008 0.011 0.011 0.013 0.012 0.010 0.010 0.008 0.012 0.010 0.010 0.014 0.017 0.012 0.015 0.008 [171] 0.012 0.009 0.011 0.012 0.010 0.005 0.006 0.005 0.003 0.005 0.007 0.006 0.004 0.005 0.017 0.009 0.013 [188] 0.015 0.013 0.003 0.004 0.004 0.004 0.004 0.003 0.008 0.010 0.007 0.008 0.008 0.008
错误原因
当前selectInput的choices存储的是字符串(比如"Atchafalaya_data$soil_organic_carbon_density"),而非实际的数值向量。执行hist(input$select)时,本质是对字符串做直方图,因此触发'x' must be numeric报错。
解决方法
方法1:条件判断匹配选择项
修改selectInput的choices为简洁标识,在server中通过if/else选择对应数据集列:
library(shiny) library(readr) library(tidyverse) data <- read_csv("Data/DeltaX_Soil_Properties_Fall2020_Spring2021_Fall2021.csv") data2 <- data[!(data$time_marker_sampled=="-9999"),] Atchafalaya_data <- data2[!(data2$basin == "Terrebonne"),] Terrebonne_data <- data2[!(data2$basin == "Atchafalaya"),] ui <- fluidPage( # 简化choices为名称,而非字符串形式的代码 selectInput( inputId = "select", label = "Sections of data", choices = c("Atchafalaya", "Terrebonne")), plotOutput(outputId = "hist") ) server <- function(input, output) { output$hist <- renderPlot({ # 根据选择项切换数据集 if(input$select == "Atchafalaya"){ hist(Atchafalaya_data$soil_organic_carbon_density, main = "Atchafalaya 土壤有机碳密度直方图", xlab = "土壤有机碳密度") } else { hist(Terrebonne_data$soil_organic_carbon_density, main = "Terrebonne 土壤有机碳密度直方图", xlab = "土壤有机碳密度") } }) } shinyApp(ui = ui, server = server)
方法2:Reactive表达式动态获取数据
若后续需扩展更多选项,这种方式更灵活:
library(shiny) library(readr) library(tidyverse) data <- read_csv("Data/DeltaX_Soil_Properties_Fall2020_Spring2021_Fall2021.csv") data2 <- data[!(data$time_marker_sampled=="-9999"),] # 将数据集存入列表,便于调用 basin_data <- list( "Atchafalaya" = data2[data2$basin == "Atchafalaya",], "Terrebonne" = data2[data2$basin == "Terrebonne",] ) ui <- fluidPage( selectInput( inputId = "select", label = "Sections of data", choices = names(basin_data)), plotOutput(outputId = "hist") ) server <- function(input, output) { # 创建reactive对象,动态返回选中的数据集列 selected_data <- reactive({ basin_data[[input$select]]$soil_organic_carbon_density }) output$hist <- renderPlot({ hist(selected_data(), main = paste(input$select, "土壤有机碳密度直方图"), xlab = "土壤有机碳密度") }) } shinyApp(ui = ui, server = server)
内容的提问来源于stack exchange,提问作者Ty Emmert
相关产品推荐
相关产品推荐

