You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 12:10:45