当前位置: 首页 > article >正文

R语言——绘制生命曲线图(细胞因子IL5)

绘制生命曲线图(根据细胞因子)

  • 说明
  • 流程
  • 代码
    • 加载包
    • 读取Excel文件
    • 清理数据
      • 重命名列名
      • 处理IL-5中的"<"符号 - 替换为检测下限的一半
        • 首先找出所有包含"<"的值
        • 检查缺失
        • 移除缺失值
        • 根据IL-5中位数将患者分为高低两组
    • 创建生存对象
    • 拟合生存曲线
    • 绘制生存曲线
  • 补充
    • data$new_column 创建新列/修改现有列
    • 更健壮的数据清理方法
    • 类型转换(转换为数值型)
    • 类型转换(转换为数值型0/1)
    • 保存 / 加载 拟合后的生存曲线对象
    • 保存绘制的生存曲线(如图片或PDF)

  1. R语言的官方环境
    R Base
    官网下载:
    https://www.r-project.org/
    包含R的核心解释器和基础功能,适合纯命令行操作。
    RStudio
    官网下载:
    https://www.rstudio.com/products/rstudio/download/

说明

初学者注意
(1)代码中所有符号不能是中文
(2)#表示后面的内容是注释,不生效
(3)括号是成对出现的

关于NA值

在 R 语言中,NA(Not Available)是用于表示缺失值(Missing Value)的特殊值。它表示某个数据点不存在、不可用或未被记录。

  1. NA 在计算中的行为
    大部分数学函数(如 sum(), mean())默认会因 NA 返回 NA
    需使用 na.rm = TRUE 忽略 NA 计算

  2. 如何检查NA值:
    is.na()

  3. 如何处理NA值:
    (1)删除 NA
    na.omit():删除所有含 NA 的行
    complete.cases() + 索引:筛选完整数据
    (2)替换 NA
    均值/中位数填充(适用于数值型数据)
    众数填充(适用于分类数据)
    插值法(时间序列数据)
    (3)计算时忽略 NA
    使用 na.rm = TRUE 忽略 NA 计算

流程

(1)加载需要的依赖
(2)读取文件
(3)预处理文件:保障所需数据的完整性、格式规范;
(4)创建对象,拟合生存曲线的数据
(5)绘制曲线

代码

加载包

library(survival)
library(survminer)
library(dplyr)
library(readxl)

如果提示没有包,就需要下载,例如:不存在叫‘survival’这个名称的程序包

install.packages("survival")

读取Excel文件

data <- read_excel("G:/术前.xlsx", sheet = "术前")

"G:/术前.xlsx"是文件名,"术前"是工作区名称

清理数据

重命名列名

# 重命名列名
colnames(data) <- c("IL5", "Status", "OS_months")

c表示列名,这里没有写列序号,是按顺序修改前三列,如果要指定修改某列列名,示例如下:

# 方法1:直接通过列索引修改特定列名
colnames(df)[3] <- "name"
colnames(df)[7] <- "data"
colnames(df)[11] <- "time"
# 方法2:使用向量一次性修改多个列名(更简洁)
colnames(df)[c(3,7,11)] <- c("name", "data", "time")

处理IL-5中的"<"符号 - 替换为检测下限的一半

首先找出所有包含"<"的值
data$IL5_clean <- ifelse(grepl("<", data$IL5), as.numeric(gsub("[^0-9.]", "", data$IL5))/2,as.numeric(data$IL5))
函数说明特点
ifelse(test, yes, no)test:逻辑测试条件,yes:当test为TRUE时返回的值,no:当test为FALSE时返回的值可以同时处理整个向量/列,会保持输入数据的结构和属性
grepl(“<”, data$IL5在IL5中搜索"<"符号默认区分大小写,可设置ignore.case=TRUE;多列中查找c(“12”, “<5”, “3<2”, “NA”)
as.numeric(data$IL5)将IL5整列的数据强制转换为数值型无法转换时会生成NA并给出警告
gsub(“[^0-9.]”, “”, data$IL5)把IL5中所有不是数字和小数点的字符串替换为空应用场景:非常适合清洗实验数据中的检测限值(如"<0.05"),可用于提取混杂在文本中的数值(如"23.5mg/L"),常用于处理实验室数据或医学检测报告中的数值
data$IL5_clean如果IL5_clean列不存在,会创建这个新列详细说明请看补充部分:data$new_column 创建新列/修改现有列

在这里插入图片描述

注意:
这个清理过程,可能会有 某些值无法被正确转换为数值的情况:比如数据中存在空字符串、非数字字符或其他格式问题
解决方法请看补充部分:更健壮的数据清理方法

检查缺失

有些行的数据不合规,通过下述代码可以进行统计不合规的数据有多少

sum(is.na(data$IL5_clean))
sum(is.na(data$Status))
sum(is.na(data$OS_months))

sum(is.na(data$ IL5_clean)):统计IL5_clean列的缺失值数量
sum(is.na(data$ Status)):统计Status列的缺失值数量
sum(is.na(data$ OS_months)):统计OS_months列的缺失值数量
输出示例:
[1] 5 # IL5_clean有5个缺失值
[1] 2 # Status有2个缺失值
[1] 3 # OS_months有3个缺失值

移除缺失值

简单粗暴的方式,把不合规的数据移除(移除整行)

data_clean <- data %>% filter(!is.na(IL5_clean) & !is.na(Status) & !is.na(OS_months))

在这里插入图片描述

创建一个新的数据框data_clean,只保留三个关键列都非缺失值的完整记录。

data_clean <- data:将数据框data复制一份到data_clean
管道操作符%>% 作用:将左侧对象传递给右侧函数的第一个参数
filter(.data, …, .preserve = FALSE)

.data:要筛选的数据框
…:逻辑条件表达式
.preserve:是否保留分组结构(高级用法)

意义

  1. 数据质量评估:
    先统计缺失值了解数据完整度
    判断是否需要插补或可以直接删除

  2. 分析准备:
    许多统计方法要求完整数据(如生存分析)
    确保后续分析基于相同的一组观测值

IL5_clean:生物标志物测量值
Status:患者状态(如生死)
OS_months:总生存期
三者都是关键分析变量,必须完整

根据IL-5中位数将患者分为高低两组
# 根据IL-5中位数将患者分为高低两组
median_il5 <- median(data_clean$IL5_clean)
data_clean$IL5_group <- ifelse(data_clean$IL5_clean > median_il5, "High", "Low")

median() 计算中位数,默认情况下,如果向量包含NA值,函数会返回NA,除非设置na.rm = TRUE
median_il5 <- 将计算得到的中位数赋值给新变量median_il5,供后续使用。
data_clean$IL5_group <- 将ifelse的结果赋值给数据框中新创建的列IL5_group。

结果呈现:
在这里插入图片描述

创建生存对象

surv_obj <- Surv(time = data_clean$OS_months, event = data_clean$Status)

Surv() 创建生存数据对象,这个对象将作为后续生存分析函数的输入。
在这里插入图片描述

注意1:
Surv() 函数要求时间变量必须是数值型。如果检查出变量类型不符合,会返回NA值
解决方案请看补充部分:类型转换(转换为数值型)
注意2:
event 参数必须是一个逻辑值(TRUE/FALSE)或数值型(0/1),其中:
0 或 FALSE 表示 删失(censored)(患者存活或失访)
1 或 TRUE 表示 事件发生(死亡)
解决方案请看补充部分:类型转换(转换为数值型0/1)

拟合生存曲线

fit <- survfit(surv_obj ~ IL5_group, data = data_clean)

survfit() 拟合生存曲线,默认使用Kaplan-Meier估计法。
在这里插入图片描述

参数解释
surv_obj ~ IL5_group:
R公式(formula),指定了生存分析的结构
左边surv_obj是我们之前用Surv()创建的生存对象
右边IL5_group是分组变量(基于之前IL5中位数分组的High/Low组)
data = data_clean:
指定了变量所在的数据框
这样可以直接使用列名(IL5_group)而不需要用data_clean$IL5_group

注意:关于如何保存拟合后的生存曲线对象,请看补充部分:保存 / 加载 拟合后的生存曲线对象

绘制生存曲线

# 使用ggsurvplot函数绘制Kaplan-Meier生存曲线图
surv_plot<-ggsurvplot(# 必需参数:生存分析结果对象,通常由survfit()函数生成fit, # 指定用于生存分析的数据集data = data_clean,# 设置y轴显示范围,为p值标签留出空间#ylim = c(0.9, 1.0),  # 更合理的范围(留出标签空间)# 逻辑值,是否在图上显示log-rank检验的p值(默认显示在右上角)pval = TRUE, # 逻辑值,是否显示p值的方法标签(如"Log-rank test")pval.method = TRUE,# 设置p值标签的位置
pval.method.coord = c(1, 1.0), # 方法标签放在 (x=1, y=1.0)pval.coord = c(2, 1.0),       # 将 P 值放在 (x=2, y=1.0)# 是否显示生存曲线的置信区间带conf.int = FALSE,# 设置置信区间带的透明度(0-1,越小越透明)# conf.int.alpha = 0.2,          # 20%透明度# 逻辑值,是否在图形下方添加风险表(显示各时间点的风险人数)risk.table = TRUE,# 设置风险表高度(占整个图形高度的比例)risk.table.height = 0.25,      # 占25%的高度# 自定义图例标签:# 使用paste()动态创建分组标签,基于IL-5的中位数分组# 第一组标签:"Low IL-5 (≤中位数值)"# 第二组标签:"High IL-5 (>中位数值)"# round(median_il5, 2)将中位数保留两位小数legend.labs = c(paste("Low IL-5 (≤", round(median_il5, 2)), paste("High IL-5 (>", round(median_il5, 2))),# 设置图例的标题为"IL-5 Group"legend.title = "IL-5 Group",# 设置x轴标签为"Time (Months)",表示时间以月为单位xlab = "Time (Months)",# 设置y轴标签为"Survival Probability",表示生存概率ylab = "Survival Probability",# 设置图形的主标题title = "Kaplan-Meier Survival Curve by IL-5 Level",# 设置两条生存曲线的颜色:# 第一组颜色为十六进制码#E7B800(红色)# 第二组颜色为十六进制码#2E9FDF(蓝色)palette = c("#FF6A6A", "#2E9FDF"),# 设置图形主题为ggplot2的简约主题(去除多余背景元素)ggtheme = theme_minimal()
)

在这里插入图片描述

RGB颜色对照表

如何保存绘制出来的曲线,请看补充部分:保存绘制的生存曲线(如图片或PDF)

补充

data$new_column 创建新列/修改现有列

一、列操作 (使用$和[ ])

  1. 单列操作
# 使用$选择单列(返回向量)
data$column_name# 使用[ ]选择单列(返回数据框)
data["column_name"]
data[, "column_name"]  # 逗号在前表示选择所有行
  1. 多列操作
# 选择多列(返回数据框)
data[c("col1", "col2", "col3")]
data[, c("col1", "col2")]# 使用列索引
data[, 1:3]  # 选择前3列
  1. 整列操作
# 创建/替换整列
data$new_column <- values_vector  # 长度需匹配行数# 删除列
data$column_name <- NULL
data[, "column_name"] <- NULL
data <- subset(data, select = -column_name)

二、行操作 (使用[ , ])

  1. 单行操作
# 选择单行(返回数据框)
data[1, ]  # 第一行
data["row_name", ]  # 如果有行名# 修改单行
data[1, ] <- c(value1, value2, ...)
  1. 多行操作
# 选择多行
data[1:5, ]  # 1-5行
data[c(1,3,5), ]  # 第1,3,5行# 条件选择
data[data$age > 30, ]  # age大于30的行
subset(data, age > 30)  # 等效方法
  1. 整行操作
# 添加新行
data <- rbind(data, new_row)# 删除行
data <- data[-c(1,3), ]  # 删除第1和3行
data <- data[data$age >= 18, ]  # 删除age<18的行

三、混合操作

  1. 选择特定行列
# 选择第1-3行,第2-4列
data[1:3, 2:4]# 条件选择特定列
data[data$age > 30, c("name", "age")]
  1. 修改特定区域
# 修改第2-3行的"score"列
data[2:3, "score"] <- c(90, 85)# 使用逻辑条件修改
data[data$gender == "M", "salary"] <- data[data$gender == "M", "salary"] * 1.1

更健壮的数据清理方法

data$IL5_clean <- sapply(data$IL5, function(x) {if (is.na(x) || x == "") {return(NA)  # 如果是NA或空字符串,返回NA} else if (grepl("<", x)) {# 提取数值并除以2num <- as.numeric(gsub("[^0-9.]", "", x))if (is.na(num)) {return(NA)  # 如果提取失败,返回NA} else {return(num / 2)}} else {# 尝试直接转换为数值num <- as.numeric(x)return(ifelse(is.na(num), NA, num))}
})

额外建议
在转换前先检查数据的唯一值:

unique(data$IL5)

(1)如果数据中有很多不规则的值,可以考虑手动处理特殊情况
(2)对于无法自动转换的值,可以单独处理或考虑是否应该排除这些观测
(3)这样修改后,应该能更稳健地处理数据转换问题,并清楚地知道哪些值无法被转换。

处理完后检查结果:

# 检查转换后的结果
sum(is.na(data$IL5_clean))  # 查看有多少NA值
which(is.na(data$IL5_clean))  # 查看哪些行有NA值
data[is.na(data$IL5_clean), ]  # 查看这些行的原始数据

类型转换(转换为数值型)

> surv_obj <- Surv(time = data_clean$OS_months, event = data_clean$Status)
错误于Surv(time = data_clean$OS_months, event = data_clean$Status): Time variable is not numeric

data_clean$OS_months 不是数值型(numeric)变量,而 Surv() 函数要求时间变量必须是数值型。我们需要先检查并转换这个变量的类型。

转换方法:

  1. 检查变量类型
# 查看变量类型
str(data_clean$OS_months)
class(data_clean$OS_months)
  1. 转换变量类型
    如果 OS_months 是字符型(character)或因子型(factor),需要转换为数值型:
# 转换为数值型
data_clean$OS_months <- as.numeric(as.character(data_clean$OS_months))# 再次检查转换结果
sum(is.na(data_clean$OS_months))  # 查看是否有转换失败的NA值
which(is.na(data_clean$OS_months))  # 查看哪些行转换失败
  1. 处理转换失败
    如果转换产生了 NA 值,可能是因为原始数据中有非数字字符(如"/"或其他符号):
# 查看原始数据中的特殊值
unique(data$OS_months)[!is.na(unique(data$OS_months)) & is.na(as.numeric(as.character(unique(data$OS_months))))]# 清理特殊字符(例如将"/"替换为NA)
data_clean$OS_months <- ifelse(data_clean$OS_months %in% c("/", "/", " "), NA, data_clean$OS_months)
data_clean$OS_months <- as.numeric(as.character(data_clean$OS_months))# 移除NA值
data_clean <- data_clean[!is.na(data_clean$OS_months), ]

然后重新转换

# 确保Status是数值型(0/1)
data_clean$Status <- as.numeric(as.character(data_clean$Status))# 再次检查转换结果
sum(is.na(data_clean$OS_months)) 
which(is.na(data_clean$OS_months))  

完成后,查看的结果如下,可以看到已经是我们需要的整数类型
在这里插入图片描述

类型转换(转换为数值型0/1)

> surv_obj <- Surv(time = data_clean$OS_months, event = data_clean$Status)
错误于Surv(time = data_clean$OS_months, event = data_clean$Status): Invalid status value, must be logical or numeric
>

解决方法:

  1. 检查 Status 的当前值和类型
# 查看 Status 列的唯一值和类型
unique(data_clean$Status)
class(data_clean$Status)

在这里插入图片描述

  1. 转换 Status 为合法的 0/1 格式

(1) 如果 Status 是字符型(如 “0”, “1”)

data_clean$Status <- as.numeric(as.character(data_clean$Status))

(2) 如果 Status 是字符串(如 “生存”, “死亡”)

data_clean$Status <- ifelse(data_clean$Status == "死亡", 1, 0)

(3) 如果 Status 包含其他值(如 2, NA)

# 只保留 0 和 1,其余设为 NA 并移除
data_clean$Status <- ifelse(data_clean$Status %in% c(0, 1), data_clean$Status, NA)
data_clean <- data_clean[!is.na(data_clean$Status), ]
  1. 重新查看
 # 查看 Status 列的唯一值和类型
unique(data_clean$Status)
class(data_clean$Status)

在这里插入图片描述

保存 / 加载 拟合后的生存曲线对象

  1. 说明:
    通过survfit()拟合的生存曲线对象,包含以下关键信息:
    生存概率:每个时间点的生存率(surv)。
    时间点:事件发生的具体时间(time)。
    风险集:每个时间点处于风险中的患者数(n.risk)。
    事件数:每个时间点发生事件的数量(n.event)。
    分组信息(如果存在,如本例中的IL5_group)。

在R中,保存拟合的生存曲线对象(如fit)后,可以随时重新加载并使用它进行绘图或分析

  1. 保存生存曲线对象
    使用save()或saveRDS()函数将对象保存到本地文件:
    方法1:使用 save()(保存为RData格式)
# 保存单个对象
save(fit, file = "survival_fit.RData")# 保存多个对象(如同时保存surv_obj和fit)
save(surv_obj, fit, file = "survival_objects.RData")

优点:可保存多个对象到一个文件。
文件格式:二进制(.RData或.rda)。

方法2:使用 saveRDS()(保存为单个对象)

saveRDS(fit, file = "survival_fit.rds")

优点:更灵活,加载时需指定新变量名(见下文)。
文件格式:二进制(.rds)

  1. 加载保存的对象
    根据保存方式选择对应的加载函数:

加载 save() 保存的文件

load("survival_fit.RData")  # 直接恢复原对象名(如fit)

加载后,对象会以原名(如fit)自动出现在环境中。

加载 saveRDS() 保存的文件

fit_loaded <- readRDS("survival_fit.rds")  # 需赋值给新变量名

可自由命名加载后的对象(如fit_loaded)。

  1. 使用加载的对象绘制生存曲线
    加载后的对象和原始对象完全一致,可直接用于绘图:

使用 survminer 包绘图

library(survminer)
ggsurvplot(fit_loaded,           # 加载后的对象data = data_clean,    # 需确保数据存在pval = TRUE, risk.table = TRUE,conf.int = TRUE,palette = "jco")      # 自定义颜色

使用基础R绘图

plot(fit_loaded, col = c("red", "blue"),xlab = "Time (months)", ylab = "Survival Probability")
legend("topright", legend = levels(data_clean$IL5_group), col = c("red", "blue"), lty = 1)
  1. 注意事项
    数据一致性:
    加载fit后,确保原始数据(data_clean)仍存在于环境中(绘图时需要分组变量IL5_group)。
    如果数据可能变动,建议将数据一并保存:
    save(fit, data_clean, file = "survival_analysis_objects.RData")
    跨平台兼容性:
    .RData和.rds文件是跨平台的,可在Windows/macOS/Linux间共享。
    版本兼容性:
    如果R版本差异较大,加载时可能出现警告,建议在相同版本环境中使用。

保存绘制的生存曲线(如图片或PDF)

  1. 使用 survminer (ggplot2-based) 保存图片
    如果你用ggsurvplot()绘制生存曲线(基于ggplot2),可以用ggsave()或print()保存为图片或PDF。

方法1:直接保存为图片/PDF

library(survminer)
library(ggplot2)# 绘制生存曲线
p <- ggsurvplot(fit, data = data_clean,pval = TRUE, risk.table = TRUE,palette = "jco")# 保存为PNG(高分辨率,600 dpi)
ggsave("survival_curve.png", plot = p$plot,width = 8, height = 6, dpi = 600)# 保存为PDF(矢量图,适合论文)
ggsave("survival_curve.pdf", plot = p$plot,width = 8, height = 6)

补充:保存PDF时不支持中文解决方法:

install.packages("showtext")
library(showtext)
font_add("SimSun", "simsun.ttc")  # Windows 系统自带宋体
showtext_auto()  # 自动启用 showtext
ggsave("survival_curve.pdf", plot = surv_plot$plot,width = 8, height = 6, device = cairo_pdf)

方法2:保存带风险表的完整图形
ggsurvplot()返回的p是一个列表,包含生存曲线(p p l o t )和风险表( p plot)和风险表(p plot)和风险表(ptable)。若需保存两者组合:

# 将图形和风险表组合
combined_plot <- arrange_ggsurvplots(list(p), print = FALSE)# 保存组合图
ggsave("survival_with_risk_table.png", combined_plot,width = 10, height = 8, dpi = 300)
  1. 使用基础R图形保存
    如果使用基础R的plot()函数,可以用以下方式保存:

保存为PNG/PDF

# 打开图形设备(PNG)
png("survival_curve_baseR.png", width = 800, height = 600, res = 150)
plot(fit, col = c("red", "blue"), xlab = "Time (months)", ylab = "Survival Probability")
legend("topright", legend = levels(data_clean$IL5_group),col = c("red", "blue"), lty = 1)
dev.off()  # 关闭设备并保存# 保存为PDF(矢量图)
pdf("survival_curve_baseR.pdf", width = 8, height = 6)
plot(fit, col = c("red", "blue"), xlab = "Time (months)", ylab = "Survival Probability")
legend("topright", legend = levels(data_clean$IL5_group),col = c("red", "blue"), lty = 1)
dev.off()
  1. 保存为可编辑的矢量图(如EPS/SVG)
    适合进一步在Illustrator或Inkscape中编辑:

通过ggsave保存为SVG

library(svglite)
ggsave("survival_curve.svg", plot = p$plot, device = svglite,width = 8, height = 6)

通过基础R保存为EPS

setEPS()
postscript("survival_curve.eps", width = 8, height = 6)
plot(fit, col = c("red", "blue"), xlab = "Time (months)", ylab = "Survival Probability")
legend("topright", legend = levels(data_clean$IL5_group),col = c("red", "blue"), lty = 1)
dev.off()
  1. 注意事项
    文件路径:
    如果不指定路径,文件会保存在当前工作目录(通过getwd()查看)。
    自定义路径示例:
    ggsave("C:/Users/Name/Desktop/survival_curve.png", plot = p$plot)
    图形分辨率:
    调整dpi(每英寸点数)和width/height控制清晰度,尤其是PNG格式。
    多图形保存:
    如果需要保存多个分面图形(如不同亚组),用循环或lapply:
    plots_list <- lapply(subgroups, function(group) {
    ggsurvplot(subset_fit, data = subset_data, …)
    })
    for (i in seq_along(plots_list)) {
    ggsave(paste0(“survival_group_”, i, “.png”), plot = plots_list[[i]])

相关文章:

R语言——绘制生命曲线图(细胞因子IL5)

绘制生命曲线图&#xff08;根据细胞因子&#xff09; 说明流程代码加载包读取Excel文件清理数据重命名列名处理IL-5中的"<"符号 - 替换为检测下限的一半首先找出所有包含"<"的值检查缺失移除缺失值根据IL-5中位数将患者分为高低两组 创建生存对象拟…...

在内网环境中为 Gogs 配置 HTTPS 访问

在内网环境中为 Gogs 配置 HTTPS 访问&#xff0c;虽然不需要公网域名&#xff0c;但仍需通过自签名证书或私有证书实现加密。以下是详细步骤和方案&#xff1a; 一、核心方案选择 方案适用场景优点缺点自签名证书快速测试、临时使用无需域名&#xff0c;快速生成浏览器提示“…...

神马系统8.5搭建过程,附源码数据库

项目介绍 神马系统是多年来流行的一款电视端应用&#xff0c;历经多年的发展&#xff0c;在稳定性和易用性方面都比较友好。 十多年前当家里的第一台智能电视买回家&#xff0c;就泡在某论坛&#xff0c;找了很多APP安装在电视上&#xff0c;其中这个神马系统就是用得很久的一…...

大模型论文:Improving Language Understanding by Generative Pre-Training

大模型论文&#xff1a;Improving Language Understanding by Generative Pre-Training OpenAI2018 文章地址&#xff1a;https://www.mikecaptain.com/resources/pdf/GPT-1.pdf 摘要 自然语言理解包括各种各样的任务&#xff0c;如文本蕴涵、问题回答、语义相似性评估和文…...

SDL视频显示函数

文章目录 1. **`SDL_Init()`**2. **`SDL_CreateWindow()`**3. **`SDL_CreateRenderer()`**4. **`SDL_CreateTexture()`**5. **`SDL_UpdateTexture()`**6. **`SDL_RenderCopy()`**7. **`SDL_RenderPresent()`**8. **`SDL_Delay()`**9. **`SDL_Quit()`**总结示例代码:代码说明:…...

[ctfshow web入门] web18

前置知识 js(javascript)语言用于前台控制&#xff0c;不需要知道他的语法是什么&#xff0c;以高级语言的阅读方式也能看懂个大概。 在JavaScript中&#xff0c;confirm()是一个用于显示确认对话框的内置函数&#xff0c;不用知道怎么使用。 信息收集 提示&#xff1a;不要…...

基于 docker 的 Xinference 全流程部署指南

Xorbits Inference (Xinference) 是一个开源平台&#xff0c;用于简化各种 AI 模型的运行和集成。借助 Xinference&#xff0c;您可以使用任何开源 LLM、嵌入模型和多模态模型在云端或本地环境中运行推理&#xff0c;并创建强大的 AI 应用。 一、下载代码 请在控制台下面执行…...

Vue组件化开发深度解析:Element UI与Ant Design Vue对比实践

一、Vue组件化开发的核心优势 1.1 组件化架构的天然优势 Vue的组件系统是其最核心的特性之一&#xff0c;采用单文件组件&#xff08;.vue&#xff09;形式&#xff0c;将HTML、CSS和JavaScript组合在同一个文件中&#xff0c;形成高内聚、低耦合的代码单元。这种设计显著提升…...

SQL Server查询性能下降:执行计划不稳定与索引优化

问题现象&#xff1a; SQL Server 2022 中某些关键查询性能突然下降&#xff0c;执行时间从毫秒级增至数秒&#xff0c;日志中未报错&#xff0c;但查询计划显示低效的索引扫描或键查找。 快速诊断 捕获实际执行计划&#xff1a; -- 启用实际执行计划 SET STATISTICS XML, TIME…...

【学Rust写CAD】31 muldiv255函数(muldiv255.rs,已经取消)

源码 // Calculates floor(a*b/255 0.5) #[inline] pub fn muldiv255(a: u32, b: u32) -> u32 {// The deriviation for this formula can be// found in "Three Wrongs Make a Right" by Jim Blinn.let tmp a * b 128;(tmp (tmp >> 8)) >> 8 }代…...

`uia.WindowControl` 是什么:获取窗口文字是基于系统的 UI 自动化接口,而非 OCR 方式

uia.WindowControl 是什么:获取窗口文字是基于系统的 UI 自动化接口,而非 OCR 方式 uia.WindowControl 通常是基于 Windows 系统的 UI 自动化框架(如 pywinauto 中的 uia 模块)里用于表示窗口控件的类。在 Windows 操作系统中,每个应用程序的窗口都可以看作是一个控件,ui…...

vue3 处理文字 根据文字单独添加class

下面写的是根据后端返回的html 提取我需要的标签和字 将他们单独添加样式 后端返回的数据 大概类似于<h1>2024年“双11”购物节网络零售监测报告</h1><p>表1 “双11” 期间网络零售热销品类TOP10</p> function checkfun(newList){if (newList) {let …...

Python爬虫教程011:scrapy爬取当当网数据开启多条管道下载及下载多页数据

文章目录 3.6.4 开启多条管道下载3.6.5 下载多页数据3.6.6 完整项目下载3.6.4 开启多条管道下载 在pipelines.py中新建管道类(用来下载图书封面图片): # 多条管道开启 # 要在settings.py中开启管道 class DangdangDownloadPipeline:def process_item(self, item, spider):…...

Jupyter Notebook不能自动打开默认浏览器怎么办?

在安装anaconda的过程中,部分用户可能会遇到,打开Jupyter Notebook的时候,不会弹出默认浏览器。本章教程给出解决办法。 一、生成一个jupyter默认配置文件 打开cmd,运行以下命令,会生成一个jupyter_notebook配置文件。 jupyter notebook --generate-config二、编辑jupyter_…...

VUE中数据绑定之OptionAPI

<template> <div> 姓名:<input v-model="userName" /> {{ userName }} <br /> 薪水:<input type="number" v-model="salary" /> <br /> <button v-on:click="submit">提交</button>…...

Spring Boot 工程创建详解

2025/4/2 向全栈工程师迈进&#xff01; 一、SpingBoot工程文件的创建 点击Project Structure 然后按着如下点击 最后选择Spring Boot &#xff0c;同时记得选择是Maven和jar&#xff0c;而不是war。因为Boot工程内置了Tomcat&#xff0c;所以不需要war。 紧接着选择Spring We…...

Spring Boot + MyBatis + Maven论坛内容管理系统源码

项目描述 xxxForum是一个基于Spring Boot MyBatis Maven开发的一个论坛内容管理系统&#xff0c;主要实现了的功能有&#xff1a; 前台页面展示数据、广告展示内容模块&#xff1a;发帖、评论、帖子分类、分页、回帖统计、访问统计、表单验证用户模块&#xff1a;权限、资料…...

国网B接口协议资源上报流程详解以及上报失败原因(电网B接口)

文章目录 一、B接口协议资源上报接口介绍B.2.1 接口描述B.2.2 接口流程B.2.3 接口参数B.2.3.1 SIP头字段B.2.3.2 SIP响应码B.2.3.3 XML Schema参数定义 B.2.4 消息示例B.2.4.1 上报前端系统的资源B.2.4.2 响应消息 二、B接口资源上报失败常见问题&#xff08;一&#xff09;证书…...

布谷一对一直播源码android版环境配置流程及功能明细

一&#xff1a;举例布谷交友&#xff08;一对一直播源码&#xff09;搭建部署的基本环境说明 1. 首先安装Center OS 7.9系统&#xff0c;硬盘最低 40G 2. 安装宝塔环境 https://bt.cn&#xff08;强烈推荐使用&#xff09; 3. 安装环境 ● PHP 7.3&#xff08;安装redis扩展…...

TypeScript 类型系统详解

基础类型​ TypeScript 支持丰富的基础数据类型&#xff0c;涵盖number、string、boolean、null、undefined、symbol以及bigint。这些类型为构建可靠的代码提供了基石。​ 数值类型&#xff08;number&#xff09;&#xff1a;在 TypeScript 里&#xff0c;所有数字均为浮点数…...

SDL多线程编程

文章目录 1. SDL 线程基础2. 线程同步3. 线程池4. 注意事项5. 示例:在多个线程中进行图形渲染和输入处理总结在 SDL(Simple DirectMedia Layer)中,多线程编程通常用于提高应用程序的响应性和性能,尤其是在需要同时处理多个任务的场景中,例如渲染、输入处理和音频等。SDL …...

【Netty4核心原理④】【简单实现 Tomcat 和 RPC框架功能】

文章目录 一、前言二、 基于 Netty 实现 Tomcat1. 基于传统 IO 重构 Tomcat1.1 创建 MyRequest 和 MyReponse 对象1.2 构建一个基础的 Servlet1.3 创建用户业务代码1.4 完成web.properties 配置1.5 创建 Tomcat 启动类 2. 基于 Netty 重构 Tomcat2.1 创建 NettyRequest和 Netty…...

C#语言的饼图

C#语言中的饼图&#xff1a;数据可视化的艺术 在现代软件开发中&#xff0c;数据可视化是一个不可或缺的重要环节。随着数据量的不断增加&#xff0c;仅仅依靠文本和表格来展示数据已显得不够直观。本文将以C#语言为基础&#xff0c;探讨如何使用C#绘制饼图&#xff0c;并进一…...

【AI学习】初步了解TRL

TRL&#xff08;Transformer Reinforcement Learning&#xff09; 是由 Hugging Face 开发的一套基于强化学习&#xff08;Reinforcement Learning, RL&#xff09;的训练工具&#xff0c;专门用于优化和微调大规模语言模型&#xff08;如 GPT、LLaMA 等&#xff09;。它结合了…...

打破界限:Android XML与Jetpack Compose深度互操作指南

在现有XML布局项目中逐步引入Jetpack Compose是现代Android开发的常见需求。本指南将全面介绍混合使用的最佳实践、技术细节和完整解决方案。 一、基础配置 1.1 Gradle配置 android {buildFeatures {compose true}composeOptions {kotlinCompilerExtensionVersion "1.5.3…...

ADASH VA5 Pro中的route功能

这段内容详细介绍了 ADASH VA5 Pro 设备中“Route&#xff08;路线&#xff09;”模块的功能、操作流程以及相关特性。以下是对这段内容的总结和分析&#xff1a; Route 模块的主要功能 路线测量&#xff1a;Route 模块用于执行路线测量任务。它允许用户创建和管理一系列测量…...

阿里云oss视频苹果端无法播放问题记录

记录一下苹果端视频不可以播放的原因. 看了一下其他视频可以正常播放,但是今天客户发来的视频无法正常播放.咨询过阿里云售后给出的原因是编码格式过高. 需要调整编码格式为:baseline, 下面记录如何使用ffmpeg修改视频的编码格式. 下载文件(可从官方下载) 配置环境变量(系统变…...

网络安全的现状与防护措施

随着数字化和信息化的迅猛发展&#xff0c;互联网已成为人们日常生活、工作和学习不可或缺的一部分。然而&#xff0c;随着网络技术的普及&#xff0c;网络安全问题也日益突出。近年来&#xff0c;数据泄露、恶意软件、网络攻击等事件层出不穷&#xff0c;给企业和个人带来了巨…...

Ubuntu离线安装mysql

在 Ubuntu 24.04 上离线安装 MySQL 的步骤如下(支持 MySQL 8.0 或 8.4): 一.安装方法 此次安装是按照方法一安装,其它方法供参考: 安装成功截图: 安全配置截图: sudo mysql_secure_installation 登录测试: 方法一:使用 apt-rdepends 下载依赖包(推荐) 1. 在联网…...

移动通信网络中漫游机制深度解析:归属网络与拜访网络的协同逻辑

文章目录 一、漫游基础概念与网络架构1.1 漫游的核心定义1.2 关键网络实体角色 二、漫入漫出详细流程解析2.1 漫出&#xff08;Outbound Roaming&#xff09;场景2.2 漫入&#xff08;Inbound Roaming&#xff09;场景 三、归属网络与拜访网络的信任演进3.1 各代网络的信任模型…...