你不知道的downloadHandler秘密:如何在Shiny中安全输出带变量的.csv文件名,避免注入风险

第一章:downloadHandler文件名安全输出概述

在Web应用开发中,文件下载功能是常见的需求之一。然而,当通过后端服务动态生成或返回文件时,若未对响应头中的文件名进行妥善处理,可能引发安全风险,例如路径遍历、恶意脚本执行或跨站脚本攻击(XSS)。`downloadHandler` 作为处理文件下载的核心组件,必须确保文件名输出的安全性,防止用户上传或构造的恶意文件名影响系统稳定性。

安全输出的关键原则

  • 始终对用户提供的文件名进行白名单过滤,仅允许字母、数字及常见分隔符(如连字符、下划线)
  • 移除或替换潜在危险字符,如路径分隔符(/、\)、控制字符和URL编码序列
  • 使用标准库函数对文件名进行URL编码,确保在Content-Disposition头中正确显示

推荐的文件名清理实现

// sanitizeFilename 清理用户提交的文件名,防止路径遍历和非法字符
func sanitizeFilename(filename string) string {
    // 移除路径信息,仅保留基础文件名
    baseName := path.Base(filename)
    // 移除上级目录引用
    baseName = strings.ReplaceAll(baseName, "..", "")
    // 只保留字母、数字、点、连字符和下划线
    re := regexp.MustCompile(`[^a-zA-Z0-9._-]`)
    cleaned := re.ReplaceAllString(baseName, "_")
    return cleaned
}
上述代码通过正则表达式限制文件名字符集,并替换非法字符为下划线,有效降低注入风险。

HTTP响应头设置规范

响应头字段推荐值说明
Content-Dispositionattachment; filename="safe_filename.txt"明确指示浏览器下载而非内联展示
Content-Typeapplication/octet-stream避免MIME类型嗅探导致的执行风险

第二章:理解downloadHandler的核心机制

2.1 downloadHandler的基本结构与执行流程

`downloadHandler` 是 Shiny 应用中处理文件下载的核心机制,其基本结构由两个关键函数组成:`download = TRUE` 的输出定义和 `server` 函数中的响应逻辑。
核心结构组成
  • outputId:绑定 UI 与服务端的唯一标识符
  • content:定义文件生成逻辑的函数,接收一个 file 参数
  • contentType:指定 MIME 类型(如 text/csv)
output$downloadData <- downloadHandler(
  filename = "data.csv",
  content = function(file) {
    write.csv(data, file)
  }
)
上述代码中,content 函数在用户触发下载时执行,将数据写入临时文件。系统自动清理临时文件,并推送文件流至客户端浏览器。整个流程由 Shiny 的事件循环驱动,确保线程安全与资源隔离。

2.2 文件名参数在outputFunction中的动态传递原理

在构建灵活的数据导出系统时,outputFunction 的设计需支持文件名的动态传参。这一机制依赖于函数参数的运行时解析,使输出路径与文件名可根据输入数据或配置实时生成。
参数传递流程
动态文件名通过函数调用链逐层传递,最终注入文件写入操作。典型实现如下:
func outputFunction(data []byte, filename string) error {
    file, err := os.Create(filename)
    if err != nil {
        return err
    }
    defer file.Close()
    _, err = file.Write(data)
    return err
}
上述代码中,filename 作为形参接收外部传入的文件名字符串。调用时可结合时间戳、用户ID等变量动态构造路径,例如:outputFunction(data, fmt.Sprintf("export_%d.txt", time.Now().Unix()))
调用示例与场景
  • 按日期生成日志文件:export_20250405.log
  • 用户专属导出:user_123_backup.json
  • 任务标识命名:job_result_{{taskId}}.csv

2.3 常见文件名注入风险场景分析

在Web应用中,文件上传功能若未对用户提交的文件名进行严格校验,攻击者可构造恶意文件名实现路径穿越、覆盖系统文件或执行任意代码。
路径遍历注入
攻击者通过在文件名中插入../尝试访问受限目录。例如上传文件名为../../../etc/passwd%00.jpg,利用截断符绕过扩展名检查。
动态拼接导致的漏洞

$filename = $_GET['name'];
file_put_contents("/var/uploads/" . $filename, $data);
上述PHP代码直接拼接用户输入,可能导致任意文件写入。应使用basename()剥离路径信息,并结合白名单校验扩展名。
  • 避免直接使用用户输入作为文件路径
  • 统一存储路径,使用UUID重命名文件
  • 设置目录权限为不可执行

2.4 R中字符串拼接与路径处理的安全边界

在R语言中,字符串拼接常用于构建文件路径,但若不加审慎处理,可能引发路径注入或跨目录访问等安全问题。使用基础函数如 paste() 时需警惕用户输入污染。
安全的路径拼接实践
推荐使用 file.path() 构建跨平台兼容路径,避免手动拼接斜杠:
# 安全构建路径
base_dir <- "/data/projects"
user_input <- "report_2023"
safe_path <- file.path(base_dir, user_input, "output.csv")
该方法自动处理操作系统差异,并防止因输入包含 ../ 导致的目录遍历风险。
输入校验与规范化
  • 使用 normalizePath() 解析真实路径,检测是否超出预期目录范围
  • 对用户输入进行白名单过滤,仅允许字母、数字和下划线

2.5 shiny::filename参数的底层解析行为

在Shiny应用中,filename参数常用于文件上传(fileInput)组件,其底层由shiny::parseQueryString和HTTP请求体共同解析。该参数并非直接暴露于UI层,而是通过服务器端input$file对象间接访问。
解析流程机制
文件上传时,浏览器以multipart/form-data编码发送请求,Shiny服务器解析后将文件元信息(含原始filename)存入临时目录,并在input对象中保留引用。

fileInput("upload", "上传文件", multiple = FALSE)
# 服务器端获取
input$upload$datapath  # 实际路径
input$upload$name       # 原始filename
上述代码中,name字段即为客户端传入的filename,Shiny未做修改,但路径被重定向至安全临时区。
安全与编码处理
  • 自动过滤路径遍历字符(如../)
  • 保留原始文件名Unicode编码
  • 服务重启后临时文件自动清除

第三章:变量嵌入文件名的正确实践方法

3.1 使用safe命名策略构建动态文件名

在自动化系统中,动态生成安全且唯一的文件名是确保数据完整性的关键环节。使用 `safe` 命名策略可有效避免特殊字符、路径遍历等引发的安全风险。
核心实现逻辑
通过正则表达式过滤非法字符,并结合时间戳与哈希值生成唯一标识:
import re
import hashlib
from datetime import datetime

def safe_filename(input_name):
    # 移除不安全字符
    cleaned = re.sub(r'[<>:"/\\|?*\x00-\x1f]', '_', input_name)
    # 附加时间戳和哈希
    timestamp = datetime.now().strftime("%Y%m%d%H%M%S")
    hash_suffix = hashlib.md5(input_name.encode()).hexdigest()[:8]
    return f"{cleaned}_{timestamp}_{hash_suffix}"
上述代码中,`re.sub` 将所有非法字符替换为下划线;`datetime` 提供时间维度唯一性;`md5` 哈希防止冲突。三者结合确保文件名既安全又可追溯。
适用场景对比
场景是否推荐说明
用户上传文件✅ 推荐防止恶意路径注入
日志自动归档✅ 推荐保证唯一性和可读性

3.2 利用gsub进行特殊字符过滤与转义

在文本处理中,特殊字符常导致解析异常或安全漏洞。使用 `gsub` 函数可高效实现字符过滤与转义。
基本语法与作用
gsub(/pattern/, "replacement", field)
该函数全局替换指定字段中所有匹配正则表达式的子串。若省略字段,则默认操作 `$0`(整行)。
常见应用场景
  • 过滤SQL注入风险字符,如单引号、分号
  • 转义JSON中的控制字符(如换行符 \n)
  • 清理用户输入中的HTML标签
实际示例:清除HTML标签
{
  gsub(/<[^>]*>/, "", $0)
  print
}
此代码将每行中的HTML标签(如 <div>、</p>)全部移除。正则模式 `<[^>]*>` 匹配任意尖括号包裹的内容,确保输出为纯文本。

3.3 结合lubridate和stringr实现可控格式化输出

在处理时间数据时,常需将日期转换为特定字符串格式。R语言中`lubridate`与`stringr`包的结合使用,可实现高度可控的格式化输出。
基础格式化流程
首先利用`lubridate`解析原始日期,再通过`stringr`进行字符串修饰:
library(lubridate)
library(stringr)

raw_date <- "2023-12-25 14:30:00"
parsed <- ymd_hms(raw_date)
formatted <- str_c("Event on: ", str_sub(format(parsed, "%Y-%m-%d %H:%M"), 1, -4))
上述代码中,`ymd_hms()`准确解析带时间的日期字符串;`format()`将其转为标准格式;`str_sub()`截取至分钟位,`str_c()`添加前缀说明。此方法适用于日志标记、报表生成等需统一输出规范的场景。
灵活定制输出样式
通过组合函数,可轻松实现如“Dec 25, 2023 at 14:30”类的人性化输出,提升数据可读性。

第四章:防御文件名注入攻击的技术方案

4.1 输入验证:限制文件名字符集范围

在处理用户上传的文件时,文件名是潜在的安全风险入口。允许特殊字符或路径遍历片段(如 ../)可能导致目录穿越、覆盖系统文件等严重漏洞。因此,必须对文件名中的字符集进行严格限制。
推荐的合法字符集
应仅允许字母、数字、连字符和下划线,避免使用空格、中文、通配符及操作系统保留字符(如 * ? < > | \ / :)。以下为常见平台禁止字符:
字符风险说明
\ / : * ? " < > |Windows/Linux 文件系统保留字符
..路径遍历攻击载体
空字符 (\0)可能导致字符串截断
代码实现示例
func sanitizeFilename(filename string) (string, error) {
    // 移除路径信息
    baseName := filepath.Base(filename)
    // 定义正则:仅允许字母数字、横线、下划线、点
    re := regexp.MustCompile(`^[a-zA-Z0-9._-]+$`)
    if !re.MatchString(baseName) {
        return "", fmt.Errorf("invalid characters in filename: %s", baseName)
    }
    return baseName, nil
}
该函数通过提取基础文件名防止路径注入,并使用正则表达式校验字符合法性,确保只接受白名单内的字符,从源头降低文件系统攻击面。

4.2 白名单机制在文件名生成中的应用

在文件上传与生成场景中,恶意构造的文件名可能导致路径穿越、命令注入等安全风险。为确保安全性,白名单机制被广泛应用于文件名合法性校验。
白名单规则设计
仅允许由字母、数字、下划线和连字符组成的文件名,扩展名限定为预定义集合(如 jpg, png, pdf)。
  • 合法字符集:a-z, A-Z, 0-9, _, -
  • 禁止符号:\, /, :, *, ?, ", <, >, |, 空格
  • 扩展名白名单:['jpg', 'png', 'pdf', 'txt']
代码实现示例
func isValidFilename(filename string) bool {
    re := regexp.MustCompile(`^[a-zA-Z0-9_-]+\.(jpg|png|pdf|txt)$`)
    return re.MatchString(filename)
}
该正则表达式确保文件名仅包含白名单字符,并以允许的扩展名结尾,有效防御非法输入。

4.3 构造沙箱环境防止路径遍历风险

在处理用户上传或请求的文件路径时,路径遍历攻击(Path Traversal)是一种常见安全威胁。通过构造恶意路径如 `../../etc/passwd`,攻击者可能访问系统敏感文件。
沙箱环境的基本实现
使用隔离目录作为根路径,限制所有文件操作在此范围内:
func safePath(root, unsafePath string) (string, error) {
	cleaned := filepath.Clean(unsafePath)
	fullPath := filepath.Join(root, cleaned)
	if !strings.HasPrefix(fullPath, root) {
		return "", fmt.Errorf("illegal path access attempt")
	}
	return fullPath, nil
}
该函数通过 filepath.Clean 规范化路径,并利用 filepath.Join 与根目录拼接。关键检查 strings.HasPrefix(fullPath, root) 确保最终路径未跳出沙箱范围,有效防御目录跳转攻击。
权限控制建议
  • 运行服务的进程应使用最小权限账户
  • 沙箱目录外的文件不应赋予可读权限
  • 定期审计日志中的异常路径请求

4.4 日志记录与异常文件名行为监控

在分布式系统中,日志是排查异常行为的重要依据。通过集中式日志收集(如ELK架构),可实时监控文件操作行为,识别非常规命名模式。
常见异常文件名特征
  • 包含随机字符串,如 tmp_8a3k2l.exe
  • 伪装成系统文件,如 svch0st.dll
  • 使用多字节或不可见字符
基于Go的文件名检测示例
func isSuspiciousFilename(filename string) bool {
    // 检测是否包含可疑关键词
    suspiciousPatterns := []string{"exe", "dll", "tmp"}
    for _, pattern := range suspiciousPatterns {
        if strings.Contains(strings.ToLower(filename), pattern) {
            return true
        }
    }
    // 检测长度异常
    return len(filename) > 50
}
该函数通过匹配敏感扩展名和超长文件名判断风险,适用于初步过滤恶意文件行为。
监控策略对比
策略实时性误报率
规则匹配
机器学习模型

第五章:总结与最佳实践建议

性能监控与调优策略
在高并发系统中,持续的性能监控是保障服务稳定的关键。推荐使用 Prometheus + Grafana 构建可视化监控体系,定期采集 GC 次数、堆内存、协程数量等关键指标。
指标建议阈值优化手段
GC Pause Time< 50msGOGC 调整、对象池复用
Goroutine 数量< 10,000限制 worker pool 规模
错误处理与日志规范
生产环境必须统一错误码体系,避免裸 panic。使用结构化日志记录异常上下文,便于排查。

func handleRequest(ctx context.Context, req *Request) error {
    defer func() {
        if r := recover(); r != nil {
            log.Error("panic recovered", "req_id", ctx.Value("req_id"), "stack", string(debug.Stack()))
        }
    }()
    
    if req.ID == "" {
        return errors.New("invalid_request: missing ID") // 明确错误语义
    }
    return process(req)
}
依赖管理与版本控制
使用 Go Modules 时应定期升级依赖至安全版本,避免已知漏洞。建议结合 govulncheck 扫描项目依赖中的 CVE 风险。
  • 每月执行一次依赖审计:govulncheck all
  • 锁定生产构建版本,禁止自动拉取 latest tag
  • 内部模块发布需通过 CI 中的兼容性测试
[Client] → [API Gateway] → [Auth Middleware] → [Service A] ↓ [Shared Cache (Redis)]
参考的代码: # Check presence of rows with cell_id of 0 cells_0 <- grep("_0$", rownames(exprMat), value = TRUE) # Check presence of Negative and SystemControl probes columns negPrb_col <- grep("^Neg", colnames(exprMat), value = TRUE) # Neg columns sysCon_col <- grep("^SystemControl", colnames(exprMat), value = TRUE) # SystemControl columns # Show head expression matrix as.matrix(exprMat[1:6, 1:10]) Chrna4 Slc6a1 Cd109 Ldha Aldoc Drd1 Tank Rit2 Prkag2 Lpar3 c_1_1_0 9 58 11 30 938 6 28 20 15 2 c_1_1_1 0 0 0 0 0 0 0 0 0 0 c_1_1_2 0 0 0 0 0 0 0 0 1 0 c_1_1_3 5 1 0 1 2 0 0 0 0 0 c_1_1_4 1 1 0 1 0 0 0 2 1 0 c_1_1_5 0 0 0 2 2 0 0 0 0 0 但是我用exprMat <- read.csv("Run5961_PDAC_Slide1_exprMat_file.csv", header = TRUE) 得到的结果与参考代码同 R version 4.4.3 (2025-02-28) -- "Trophy Case" Copyright (C) 2025 The R Foundation for Statistical Computing Platform: x86_64-pc-linux-gnu R是自由软件,任何担保。 在某些条件下你可以将其自由分发。 用'license()'或'licence()'来看分发的详细条件。 R是个合作计划,有许多人为之做出了贡献. 用'contributors()'来看合著者的详细情况 用'citation()'会告诉你如何在出版物中正确地引用R或R程序包。 用'demo()'来看一些示例程序,用'help()'来阅读在线帮助文件,或 用'help.start()'通过HTML浏览器来看帮助文件。 输入'q()'退出R. > setwd("/data1/firefox") > BiocManager::install("NanoStringNCTtools") 'getOption("repos")' replaces Bioconductor standard repositories, see 'help("repositories", package = "BiocManager")' for details. Replacement repositories: CRAN: https://cloud.r-project.org Bioconductor version 3.20 (BiocManager 1.30.25), R 4.4.3 (2025-02-28) Installing package(s) 'NanoStringNCTtools' Installation paths not writeable, unable to update packages path: /usr/lib/R/library packages: boot, codetools, foreign, lattice, Matrix, mgcv, nlme, spatial Old packages: 'aplot', 'BiocManager', 'BiocParallel', 'bookdown', 'broom', 'Cairo', 'checkmate', 'cli', 'collections', 'colorspace', 'cols4all', 'commonmark', 'cowplot', 'credentials', 'crosstalk', 'curl', 'data.table', 'data.tree', 'dbplyr', 'dbscan', 'Deriv', 'diffobj', 'doBy', 'DT', 'dtplyr', 'evaluate', 'fastcluster', 'fields', 'fitdistrplus', 'forcats', 'fs', 'future', 'future.apply', 'gargle', 'generics', 'ggforce', 'ggfun', 'ggnetwork', 'ggnewscale', 'ggplot2', 'ggplotify', 'ggpubr', 'ggraph', 'ggridges', 'ggsci', 'ggtangle', 'gh', 'globals', 'googledrive', 'googlesheets4', 'haven', 'here', 'httpuv', 'httr2', 'igraph', 'later', 'logger', 'magick', 'magrittr', 'maps', 'miniUI', 'mockr', 'modeltools', 'msigdbr', 'nanoarrow', 'openssl', 'parallelly', 'patchwork', 'pbapply', 'pbkrtest', 'pheatmap', 'pillar', 'pkgbuild', 'pkgdown', 'pkgload', 'plotly', 'progressr', 'promises', 'ps', 'psych', 'purrr', 'R.cache', 'R.oo', 'ragg', 'Rcpp', 'RcppArmadillo', 'RcppParallel', 'reformulas', 'ResidualMatrix', 'restfulr', 'reticulate', 'rlang', 'roxygen2', 'rprojroot', 'rsample', 'RSQLite', 'RUnit', 'rvest', 's2', 'sass', 'scales', 'scatterpie', 'SCpubr', 'sctransform', 'SeuratObject', 'sf', 'shiny', 'spacesXYZ', 'spatstat', 'spatstat.data', 'spatstat.explore', 'spatstat.geom', 'spatstat.linnet', 'spatstat.model', 'spatstat.random', 'spatstat.univar', 'spatstat.utils', 'spdep', 'stringr', 'survminer', 'svglite', 'systemfonts', 'tensor', 'terra', 'textshaping', 'TH.data', 'tibble', 'tinytex', 'usethis', 'utf8', 'V8', 'vroom', 'waldo', 'xfun', 'xgboost', 'XML', 'xml2', 'yulab.utils', 'zip', 'zoo' Update all/some/none? [a/s/n]: n 警告信息: package ‘NanoStringNCTtools’ is not available for Bioconductor version '3.20' A version of this package for your version of R might be available elsewhere, see the ideas at https://cran.r-project.org/doc/manuals/r-patched/R-admin.html#Installing-packages > BiocManager::install("NanoStringNCTools") 'getOption("repos")' replaces Bioconductor standard repositories, see 'help("repositories", package = "BiocManager")' for details. Replacement repositories: CRAN: https://cloud.r-project.org Bioconductor version 3.20 (BiocManager 1.30.25), R 4.4.3 (2025-02-28) Installing package(s) 'NanoStringNCTools' 还安装依赖关系‘S7’, ‘scales’, ‘ggplot2’, ‘ggiraph’, ‘ggthemes’ 试开URL’https://cloud.r-project.org/src/contrib/S7_0.2.0.tar.gz' Content type 'application/x-gzip' length 183153 bytes (178 KB) ================================================== downloaded 178 KB 试开URL’https://cloud.r-project.org/src/contrib/scales_1.4.0.tar.gz' Content type 'application/x-gzip' length 328671 bytes (320 KB) ================================================== downloaded 320 KB 试开URL’https://cloud.r-project.org/src/contrib/ggplot2_4.0.0.tar.gz' Content type 'application/x-gzip' length 3810397 bytes (3.6 MB) ================================================== downloaded 3.6 MB 试开URL’https://cloud.r-project.org/src/contrib/ggiraph_0.9.1.tar.gz' Content type 'application/x-gzip' length 392782 bytes (383 KB) ================================================== downloaded 383 KB 试开URL’https://cloud.r-project.org/src/contrib/ggthemes_5.1.0.tar.gz' Content type 'application/x-gzip' length 493992 bytes (482 KB) ================================================== downloaded 482 KB 试开URL’https://bioconductor.org/packages/3.20/bioc/src/contrib/NanoStringNCTools_1.14.0.tar.gz' Content type 'application/gzip' length 382477 bytes (373 KB) ================================================== downloaded 373 KB * installing *source* package ‘S7’ ... ** 成功将‘S7’程序包解包并MD5和检查 ** using staged installation ** libs using C compiler: ‘gcc (Ubuntu 9.4.0-1ubuntu1~20.04.2) 9.4.0’ gcc -I"/usr/share/R/include" -DNDEBUG -fpic -g -O2 -fdebug-prefix-map=/build/r-base-0GHeEU/r-base-4.4.3=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -c init.c -o init.o gcc -I"/usr/share/R/include" -DNDEBUG -fpic -g -O2 -fdebug-prefix-map=/build/r-base-0GHeEU/r-base-4.4.3=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -c method-dispatch.c -o method-dispatch.o gcc -I"/usr/share/R/include" -DNDEBUG -fpic -g -O2 -fdebug-prefix-map=/build/r-base-0GHeEU/r-base-4.4.3=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -c prop.c -o prop.o gcc -shared -L/usr/lib/R/lib -Wl,-Bsymbolic-functions -Wl,-z,relro -o S7.so init.o method-dispatch.o prop.o -L/usr/lib/R/lib -lR installing to /home/user/R/x86_64-pc-linux-gnu-library/4.4/00LOCK-S7/00new/S7/libs ** R ** inst ** byte-compile and prepare package for lazy loading ** help *** installing help indices ** building package indices ** installing vignettes ** testing if installed package can be loaded from temporary location ** checking absolute paths in shared objects and dynamic libraries ** testing if installed package can be loaded from final location ** testing if installed package keeps a record of temporary installation path * DONE (S7) * installing *source* package ‘scales’ ... ** 成功将‘scales’程序包解包并MD5和检查 ** using staged installation ** R ** byte-compile and prepare package for lazy loading ** help *** installing help indices *** copying figures ** building package indices ** testing if installed package can be loaded from temporary location ** testing if installed package can be loaded from final location ** testing if installed package keeps a record of temporary installation path * DONE (scales) * installing *source* package ‘ggplot2’ ... ** 成功将‘ggplot2’程序包解包并MD5和检查 ** using staged installation ** R ** data *** moving datasets to lazyload DB ** inst ** byte-compile and prepare package for lazy loading ** help *** installing help indices *** copying figures ** building package indices ** installing vignettes ** testing if installed package can be loaded from temporary location ** testing if installed package can be loaded from final location ** testing if installed package keeps a record of temporary installation path * DONE (ggplot2) * installing *source* package ‘ggiraph’ ... ** 成功将‘ggiraph’程序包解包并MD5和检查 ** using staged installation ** libs using C++ compiler: ‘g++ (Ubuntu 9.4.0-1ubuntu1~20.04.2) 9.4.0’ g++ -std=gnu++17 -I"/usr/share/R/include" -DNDEBUG -I'/home/user/R/x86_64-pc-linux-gnu-library/4.4/Rcpp/include' -I'/home/user/R/x86_64-pc-linux-gnu-library/4.4/systemfonts/include' -fpic -g -O2 -fdebug-prefix-map=/build/r-base-0GHeEU/r-base-4.4.3=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -c RcppExports.cpp -o RcppExports.o g++ -std=gnu++17 -I"/usr/share/R/include" -DNDEBUG -I'/home/user/R/x86_64-pc-linux-gnu-library/4.4/Rcpp/include' -I'/home/user/R/x86_64-pc-linux-gnu-library/4.4/systemfonts/include' -fpic -g -O2 -fdebug-prefix-map=/build/r-base-0GHeEU/r-base-4.4.3=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -c a_color.cpp -o a_color.o g++ -std=gnu++17 -I"/usr/share/R/include" -DNDEBUG -I'/home/user/R/x86_64-pc-linux-gnu-library/4.4/Rcpp/include' -I'/home/user/R/x86_64-pc-linux-gnu-library/4.4/systemfonts/include' -fpic -g -O2 -fdebug-prefix-map=/build/r-base-0GHeEU/r-base-4.4.3=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -c clip.cpp -o clip.o g++ -std=gnu++17 -I"/usr/share/R/include" -DNDEBUG -I'/home/user/R/x86_64-pc-linux-gnu-library/4.4/Rcpp/include' -I'/home/user/R/x86_64-pc-linux-gnu-library/4.4/systemfonts/include' -fpic -g -O2 -fdebug-prefix-map=/build/r-base-0GHeEU/r-base-4.4.3=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -c dsvg.cpp -o dsvg.o g++ -std=gnu++17 -I"/usr/share/R/include" -DNDEBUG -I'/home/user/R/x86_64-pc-linux-gnu-library/4.4/Rcpp/include' -I'/home/user/R/x86_64-pc-linux-gnu-library/4.4/systemfonts/include' -fpic -g -O2 -fdebug-prefix-map=/build/r-base-0GHeEU/r-base-4.4.3=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -c dsvg_dev.cpp -o dsvg_dev.o g++ -std=gnu++17 -I"/usr/share/R/include" -DNDEBUG -I'/home/user/R/x86_64-pc-linux-gnu-library/4.4/Rcpp/include' -I'/home/user/R/x86_64-pc-linux-gnu-library/4.4/systemfonts/include' -fpic -g -O2 -fdebug-prefix-map=/build/r-base-0GHeEU/r-base-4.4.3=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -c geom.cpp -o geom.o g++ -std=gnu++17 -I"/usr/share/R/include" -DNDEBUG -I'/home/user/R/x86_64-pc-linux-gnu-library/4.4/Rcpp/include' -I'/home/user/R/x86_64-pc-linux-gnu-library/4.4/systemfonts/include' -fpic -g -O2 -fdebug-prefix-map=/build/r-base-0GHeEU/r-base-4.4.3=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -c indexed.cpp -o indexed.o g++ -std=gnu++17 -I"/usr/share/R/include" -DNDEBUG -I'/home/user/R/x86_64-pc-linux-gnu-library/4.4/Rcpp/include' -I'/home/user/R/x86_64-pc-linux-gnu-library/4.4/systemfonts/include' -fpic -g -O2 -fdebug-prefix-map=/build/r-base-0GHeEU/r-base-4.4.3=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -c interactive.cpp -o interactive.o g++ -std=gnu++17 -I"/usr/share/R/include" -DNDEBUG -I'/home/user/R/x86_64-pc-linux-gnu-library/4.4/Rcpp/include' -I'/home/user/R/x86_64-pc-linux-gnu-library/4.4/systemfonts/include' -fpic -g -O2 -fdebug-prefix-map=/build/r-base-0GHeEU/r-base-4.4.3=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -c mask.cpp -o mask.o g++ -std=gnu++17 -I"/usr/share/R/include" -DNDEBUG -I'/home/user/R/x86_64-pc-linux-gnu-library/4.4/Rcpp/include' -I'/home/user/R/x86_64-pc-linux-gnu-library/4.4/systemfonts/include' -fpic -g -O2 -fdebug-prefix-map=/build/r-base-0GHeEU/r-base-4.4.3=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -c pattern.cpp -o pattern.o g++ -std=gnu++17 -I"/usr/share/R/include" -DNDEBUG -I'/home/user/R/x86_64-pc-linux-gnu-library/4.4/Rcpp/include' -I'/home/user/R/x86_64-pc-linux-gnu-library/4.4/systemfonts/include' -fpic -g -O2 -fdebug-prefix-map=/build/r-base-0GHeEU/r-base-4.4.3=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -c raster.cpp -o raster.o g++ -std=gnu++17 -I"/usr/share/R/include" -DNDEBUG -I'/home/user/R/x86_64-pc-linux-gnu-library/4.4/Rcpp/include' -I'/home/user/R/x86_64-pc-linux-gnu-library/4.4/systemfonts/include' -fpic -g -O2 -fdebug-prefix-map=/build/r-base-0GHeEU/r-base-4.4.3=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -c shapes.cpp -o shapes.o g++ -std=gnu++17 -I"/usr/share/R/include" -DNDEBUG -I'/home/user/R/x86_64-pc-linux-gnu-library/4.4/Rcpp/include' -I'/home/user/R/x86_64-pc-linux-gnu-library/4.4/systemfonts/include' -fpic -g -O2 -fdebug-prefix-map=/build/r-base-0GHeEU/r-base-4.4.3=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -c svg.cpp -o svg.o g++ -std=gnu++17 -I"/usr/share/R/include" -DNDEBUG -I'/home/user/R/x86_64-pc-linux-gnu-library/4.4/Rcpp/include' -I'/home/user/R/x86_64-pc-linux-gnu-library/4.4/systemfonts/include' -fpic -g -O2 -fdebug-prefix-map=/build/r-base-0GHeEU/r-base-4.4.3=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -c text.cpp -o text.o g++ -std=gnu++17 -I"/usr/share/R/include" -DNDEBUG -I'/home/user/R/x86_64-pc-linux-gnu-library/4.4/Rcpp/include' -I'/home/user/R/x86_64-pc-linux-gnu-library/4.4/systemfonts/include' -fpic -g -O2 -fdebug-prefix-map=/build/r-base-0GHeEU/r-base-4.4.3=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -c tinyxml2.cpp -o tinyxml2.o g++ -std=gnu++17 -I"/usr/share/R/include" -DNDEBUG -I'/home/user/R/x86_64-pc-linux-gnu-library/4.4/Rcpp/include' -I'/home/user/R/x86_64-pc-linux-gnu-library/4.4/systemfonts/include' -fpic -g -O2 -fdebug-prefix-map=/build/r-base-0GHeEU/r-base-4.4.3=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -c utils.cpp -o utils.o g++ -std=gnu++17 -shared -L/usr/lib/R/lib -Wl,-Bsymbolic-functions -Wl,-z,relro -o ggiraph.so RcppExports.o a_color.o clip.o dsvg.o dsvg_dev.o geom.o indexed.o interactive.o mask.o pattern.o raster.o shapes.o svg.o text.o tinyxml2.o utils.o -lpng -lz -L/usr/lib/R/lib -lR installing to /home/user/R/x86_64-pc-linux-gnu-library/4.4/00LOCK-ggiraph/00new/ggiraph/libs ** R ** inst ** byte-compile and prepare package for lazy loading ** help *** installing help indices *** copying figures ** building package indices ** installing vignettes ** testing if installed package can be loaded from temporary location ** checking absolute paths in shared objects and dynamic libraries ** testing if installed package can be loaded from final location ** testing if installed package keeps a record of temporary installation path * DONE (ggiraph) * installing *source* package ‘ggthemes’ ... ** 成功将‘ggthemes’程序包解包并MD5和检查 ** using staged installation ** R ** data *** moving datasets to lazyload DB ** inst ** byte-compile and prepare package for lazy loading ** help *** installing help indices ** building package indices ** testing if installed package can be loaded from temporary location ** testing if installed package can be loaded from final location ** testing if installed package keeps a record of temporary installation path * DONE (ggthemes) * installing *source* package ‘NanoStringNCTools’ ... ** 成功将‘NanoStringNCTools’程序包解包并MD5和检查 ** using staged installation ** R ** inst ** byte-compile and prepare package for lazy loading ** help *** installing help indices ** building package indices ** installing vignettes ** testing if installed package can be loaded from temporary location ** testing if installed package can be loaded from final location ** testing if installed package keeps a record of temporary installation path * DONE (NanoStringNCTools) 下载的程序包在 ‘/tmp/Rtmp5RH1TC/downloaded_packages’里 Installation paths not writeable, unable to update packages path: /usr/lib/R/library packages: boot, codetools, foreign, lattice, Matrix, mgcv, nlme, spatial Old packages: 'aplot', 'BiocManager', 'BiocParallel', 'bookdown', 'broom', 'Cairo', 'checkmate', 'cli', 'collections', 'colorspace', 'cols4all', 'commonmark', 'cowplot', 'credentials', 'crosstalk', 'curl', 'data.table', 'data.tree', 'dbplyr', 'dbscan', 'Deriv', 'diffobj', 'doBy', 'DT', 'dtplyr', 'evaluate', 'fastcluster', 'fields', 'fitdistrplus', 'forcats', 'fs', 'future', 'future.apply', 'gargle', 'generics', 'ggforce', 'ggfun', 'ggnetwork', 'ggnewscale', 'ggplotify', 'ggpubr', 'ggraph', 'ggridges', 'ggsci', 'ggtangle', 'gh', 'globals', 'googledrive', 'googlesheets4', 'haven', 'here', 'httpuv', 'httr2', 'igraph', 'later', 'logger', 'magick', 'magrittr', 'maps', 'miniUI', 'mockr', 'modeltools', 'msigdbr', 'nanoarrow', 'openssl', 'parallelly', 'patchwork', 'pbapply', 'pbkrtest', 'pheatmap', 'pillar', 'pkgbuild', 'pkgdown', 'pkgload', 'plotly', 'progressr', 'promises', 'ps', 'psych', 'purrr', 'R.cache', 'R.oo', 'ragg', 'Rcpp', 'RcppArmadillo', 'RcppParallel', 'reformulas', 'ResidualMatrix', 'restfulr', 'reticulate', 'rlang', 'roxygen2', 'rprojroot', 'rsample', 'RSQLite', 'RUnit', 'rvest', 's2', 'sass', 'scatterpie', 'SCpubr', 'sctransform', 'SeuratObject', 'sf', 'shiny', 'spacesXYZ', 'spatstat', 'spatstat.data', 'spatstat.explore', 'spatstat.geom', 'spatstat.linnet', 'spatstat.model', 'spatstat.random', 'spatstat.univar', 'spatstat.utils', 'spdep', 'stringr', 'survminer', 'svglite', 'systemfonts', 'tensor', 'terra', 'textshaping', 'TH.data', 'tibble', 'tinytex', 'usethis', 'utf8', 'V8', 'vroom', 'waldo', 'xfun', 'xgboost', 'XML', 'xml2', 'yulab.utils', 'zip', 'zoo' Update all/some/none? [a/s/n]: n > library(NanoStringNCTools) 载入需要的程序包:Biobase 载入需要的程序包:BiocGenerics 载入程序包:‘BiocGenerics’ The following objects are masked from ‘package:stats’: IQR, mad, sd, var, xtabs The following objects are masked from ‘package:base’: anyDuplicated, aperm, append, as.data.frame, basename, cbind, colnames, dirname, do.call, duplicated, eval, evalq, Filter, Find, get, grep, grepl, intersect, is.unsorted, lapply, Map, mapply, match, mget, order, paste, pmax, pmax.int, pmin, pmin.int, Position, rank, rbind, Reduce, rownames, sapply, saveRDS, setdiff, table, tapply, union, unique, unsplit, which.max, which.min Welcome to Bioconductor Vignettes contain introductory material; view with 'browseVignettes()'. To cite Bioconductor, see 'citation("Biobase")', and for packages 'citation("pkgname")'. 载入需要的程序包:S4Vectors 载入需要的程序包:stats4 载入程序包:‘S4Vectors’ The following object is masked from ‘package:utils’: findMatches The following objects are masked from ‘package:base’: expand.grid, I, unname 载入需要的程序包:ggplot2 > library(Seurat) 载入需要的程序包:SeuratObject 载入需要的程序包:sp 载入程序包:‘SeuratObject’ The following object is masked from ‘package:S4Vectors’: intersect The following object is masked from ‘package:BiocGenerics’: intersect The following objects are masked from ‘package:base’: intersect, t > slide1_obj <- ReadNanostring( + data.dir = ".", + mtx.file = "GSE277782_Run5961_PDAC_Slide1_exprMat_file.csv.gz", + metadata.file = "GSE277782_Run5961_PDAC_Slide1_metadata_file.csv.gz", + segmentations.file = "GSE277782_Run5961_PDAC_Slide1-polygons.csv.gz", + fov.file = "GSE277782_Run5961_PDAC_Slide1_fov_positions_file.csv.gz", + assay = "Spatial" + ) 错误于ReadNanostring(data.dir = ".", mtx.file = "GSE277782_Run5961_PDAC_Slide1_exprMat_file.csv.gz", : 参数没有用(fov.file = "GSE277782_Run5961_PDAC_Slide1_fov_positions_file.csv.gz", assay = "Spatial") > slide1_obj <- ReadNanostring( + data.dir = ".", + mtx.file = "GSE277782_Run5961_PDAC_Slide1_exprMat_file.csv.gz", + metadata.file = "GSE277782_Run5961_PDAC_Slide1_metadata_file.csv.gz", + segmentations.file = "GSE277782_Run5961_PDAC_Slide1-polygons.csv.gz" + ) 错误于ReadNanostring(data.dir = ".", mtx.file = "GSE277782_Run5961_PDAC_Slide1_exprMat_file.csv.gz", :到对象'mx' > slide1_obj <- ReadNanostring( + data.dir = "/data1/firefox", + mtx.file = "GSE277782_Run5961_PDAC_Slide1_exprMat_file.csv.gz", + metadata.file = "GSE277782_Run5961_PDAC_Slide1_metadata_file.csv.gz", + segmentations.file = "GSE277782_Run5961_PDAC_Slide1-polygons.csv.gz" + ) 错误于ReadNanostring(data.dir = "/data1/firefox", mtx.file = "GSE277782_Run5961_PDAC_Slide1_exprMat_file.csv.gz", :到对象'mx' > required_files <- c( + mtx = "GSE277782_Run5961_PDAC_Slide1_exprMat_file.csv.gz", + metadata = "GSE277782_Run5961_PDAC_Slide1_metadata_file.csv.gz", + segmentations = "GSE277782_Run5961_PDAC_Slide1-polygons.csv.gz" + ) > file_check <- sapply(required_files, function(file) { + file.exists(file) + }) > if (all(file_check)) { + cat("✅ 所有必要文件均存在\n") + } else { + missing_files <- names(file_check)[!file_check] + cat("❌ 缺失以下必要文件:\n") + cat(paste("-", missing_files, "\n", sep="")) + stop("请先确保所有文件存在于指定目录") + } ✅ 所有必要文件均存在 > # 检查表达矩阵格式(前5行5列) > cat("\n=== 验证表达矩阵格式 ===\n") === 验证表达矩阵格式 === > tryCatch({ + mtx_sample <- read.csv(required_files["mtx"], nrows=5, header=TRUE) + cat("表达矩阵前5行5列预览:\n") + print(head(mtx_sample[, 1:5])) + if (!is.numeric(as.matrix(mtx_sample[, -1]))) { + stop("表达矩阵包含非数值数据") + } + cat("✅ 表达矩阵格式验证通过\n") + }, error = function(e) { + cat("❌ 表达矩阵格式错误:", e$message, "\n") + stop("请检查表达矩阵文件格式") + }) 表达矩阵前5行5列预览: fov cell_ID RAMP2 CD83 RYK 1 1 0 13 59 36 2 1 1 0 0 1 3 1 2 0 0 0 4 1 3 1 0 0 5 1 4 0 0 0 ✅ 表达矩阵格式验证通过 > # ----------------------------- > # 步骤2:使用修正参数调用ReadNanostring > # ----------------------------- > cat("\n=== 尝试加载数据 ===\n") === 尝试加载数据 === > if (!requireNamespace("NanoStringNCTools", quietly=TRUE)) { + stop("NanoStringNCTools包未安装") + } > library(NanoStringNCTools) > library(Seurat) > # 尝试使用基础参数加载(避免可能的内部变量冲突) > tryCatch({ + # 仅使用必要参数,避免复杂参数组合 + slide1_obj <- ReadNanostring( + data.dir = data_dir, + mtx.file = required_files["mtx"], + metadata.file = required_files["metadata"], + segmentations.file = required_files["segmentations"], + verbose = TRUE # 输出详细过程信息 + ) + cat("✅ 数据加载成功\n") + }, error = function(e) { + cat("❌ ReadNanostring调用失败:", e$message, "\n") + + # ----------------------------- + # 备选方案:手动构建Seurat对象 + # ----------------------------- + cat("\n=== 尝试备选方案:手动构建Seurat对象 ===\n") + + # 1. 读取表达矩阵 + cat("读取表达矩阵...\n") + expr_matrix <- read.csv(required_files["mtx"], row.names=1) %>% as.matrix() + + # 2. 读取元数据 + cat("读取元数据...\n") + metadata <- read.csv(required_files["metadata"], row.names=1) + + # 3. 读取空间坐标(从segmentations文件) + cat("读取空间坐标...\n") + segmentations <- read.csv(required_files["segmentations"]) + coords <- segmentations %>% + select(cell_id, x, y) %>% # 根据实际列名调整 + column_to_rownames("cell_id") + + # 4. 创建Seurat对象 + cat("创建Seurat对象...\n") + seurat_obj <- CreateSeuratObject( + counts = expr_matrix, + meta.data = metadata + ) + + # 5. 添加空间坐标 + if (nrow(coords) > 0) { + seurat_obj@images$image <- new( + Class = "SpatialImage", + assay = "RNA", + coordinates = coords[colnames(seurat_obj), ] + ) + cat("✅ 已添加空间坐标信息\n") + } + + # 6. 保存结果 + saveRDS(seurat_obj, "manual_seurat_object.rds") + cat("✅ 备选方案成功:手动创建的Seurat对象已保存为manual_seurat_object.rds\n") + cat("请使用以下代码加载:\n") + cat("seurat_obj <- readRDS('manual_seurat_object.rds')\n") + }) ❌ ReadNanostring调用失败: 参数没有用(verbose = TRUE) === 尝试备选方案:手动构建Seurat对象 === 读取表达矩阵... 错误于read.csv(required_files["mtx"], row.names = 1) %>% as.matrix(): 没有"%>%"这个函数 Called from: value[[3L]](cond) Browse[1]> Q > library(dplyr) 载入程序包:‘dplyr’ The following object is masked from ‘package:NanoStringNCTools’: groups The following objects are masked from ‘package:S4Vectors’: first, intersect, rename, setdiff, setequal, union The following object is masked from ‘package:Biobase’: combine The following objects are masked from ‘package:BiocGenerics’: combine, intersect, setdiff, union The following objects are masked from ‘package:stats’: filter, lag The following objects are masked from ‘package:base’: intersect, setdiff, setequal, union > # 尝试使用基础参数加载(避免可能的内部变量冲突) > tryCatch({ + # 仅使用必要参数,避免复杂参数组合 + slide1_obj <- ReadNanostring( + data.dir = data_dir, + mtx.file = required_files["mtx"], + metadata.file = required_files["metadata"], + segmentations.file = required_files["segmentations"], + verbose = TRUE # 输出详细过程信息 + ) + cat("✅ 数据加载成功\n") + }, error = function(e) { + cat("❌ ReadNanostring调用失败:", e$message, "\n") + + # ----------------------------- + # 备选方案:手动构建Seurat对象 + # ----------------------------- + cat("\n=== 尝试备选方案:手动构建Seurat对象 ===\n") + + # 1. 读取表达矩阵 + cat("读取表达矩阵...\n") + expr_matrix <- read.csv(required_files["mtx"], row.names=1) %>% as.matrix() + + # 2. 读取元数据 + cat("读取元数据...\n") + metadata <- read.csv(required_files["metadata"], row.names=1) + + # 3. 读取空间坐标(从segmentations文件) + cat("读取空间坐标...\n") + segmentations <- read.csv(required_files["segmentations"]) + coords <- segmentations %>% + select(cell_id, x, y) %>% # 根据实际列名调整 + column_to_rownames("cell_id") + + # 4. 创建Seurat对象 + cat("创建Seurat对象...\n") + seurat_obj <- CreateSeuratObject( + counts = expr_matrix, + meta.data = metadata + ) + + # 5. 添加空间坐标 + if (nrow(coords) > 0) { + seurat_obj@images$image <- new( + Class = "SpatialImage", + assay = "RNA", + coordinates = coords[colnames(seurat_obj), ] + ) + cat("✅ 已添加空间坐标信息\n") + } + + # 6. 保存结果 + saveRDS(seurat_obj, "manual_seurat_object.rds") + cat("✅ 备选方案成功:手动创建的Seurat对象已保存为manual_seurat_object.rds\n") + cat("请使用以下代码加载:\n") + cat("seurat_obj <- readRDS('manual_seurat_object.rds')\n") + }) ❌ ReadNanostring调用失败: 参数没有用(verbose = TRUE) === 尝试备选方案:手动构建Seurat对象 === 读取表达矩阵... 错误于h(simpleError(msg, call)): 在为函数“as.matrix”选择方法时计算参数“x”时出错:'row.names'里能有重复的名称 Called from: h(simpleError(msg, call)) Browse[1]> Q > ?ReadNanostring > slide1_obj <- ReadNanostring( + data.dir = "/data1/firefox", + mtx.file = "GSE277782_Run5961_PDAC_Slide1_exprMat_file.csv.gz", + metadata.file = "GSE277782_Run5961_PDAC_Slide1_metadata_file.csv.gz", + molecules.file = "" + segmentations.file = "GSE277782_Run5961_PDAC_Slide1-polygons.csv.gz" 错误: 意外的符号 于 " molecules.file = "" segmentations.file" > slide1_obj <- ReadNanostring( + data.dir = "/data1/firefox", + mtx.file = "GSE277782_Run5961_PDAC_Slide1_exprMat_file.csv.gz", + metadata.file = "GSE277782_Run5961_PDAC_Slide1_metadata_file.csv.gz", + segmentations.file = "GSE277782_Run5961_PDAC_Slide1-polygons.csv.gz" + ) 错误于ReadNanostring(data.dir = "/data1/firefox", mtx.file = "GSE277782_Run5961_PDAC_Slide1_exprMat_file.csv.gz", :到对象'mx' > rm(mtx_sample) > setwd("/data1/firefox/GSE277782_Run5961_PDAC_Slide1") > slide1_obj <- ReadNanostring( + data.dir = "/data1/firefox/GSE277782_Run5961_PDAC_Slide1", + mtx.file = "Run5961_PDAC_Slide1_exprMat_file.csv", + metadata.file = "Run5961_PDAC_Slide1_metadata_file.csv", + molecules.file = "Run5961_PDAC_Slide1_tx_file.csv", + segmentations.file = "Run5961_PDAC_Slide1-polygons.csv" + ) > View(slide1_obj) > library(magick) Linking to ImageMagick 6.9.10.23 Enabled features: fontconfig, freetype, fftw, lcms, pango, webp, x11 Disabled features: cairo, ghostscript, heic, raw, rsvg Using 96 threads > slide1_obj <- ReadNanostring( + data.dir = "/data1/firefox/GSE277782_Run5961_PDAC_Slide1", + mtx.file = "Run5961_PDAC_Slide1_exprMat_file.csv", + metadata.file = "Run5961_PDAC_Slide1_metadata_file.csv", + molecules.file = "Run5961_PDAC_Slide1_tx_file.csv", + segmentations.file = "Run5961_PDAC_Slide1-polygons.csv" + ) > fov_positions <- read.csv( + "Run5961_PDAC_Slide1_fov_positions_file.csv", + header = TRUE + ) > cat("FOV位置数据列名:", colnames(fov_positions), "\n") FOV位置数据列名: fov x_global_px y_global_px > max_x <- max(fov_positions$x_global_px) + 2048 > max_x <- max(fov_positions$x_global_px) + 2048 > max_y <- max(fov_positions$y_global_px) + 2048 # 假设单视野高2048像素 > combined_image <- image_blank( + width = max_x, + height = max_y, + color = "white" # 白色背景 + ) 错误: rsession: width or height exceeds limit `#FFFFFFFFFFFF' @ error/cache.c/OpenPixelCache/3911 > cat("x_global_px范围:", range(fov_positions$x_global_px), "\n") x_global_px范围: -193718.9 -96445.92 > > cat("y_global_px范围:", range(fov_positions$y_global_px), "\n") y_global_px范围: -74903.74 65186.42 > > View(fov_positions) > library(data.table) # Efficient data management data.table 1.17.0,使用了 48 个线程(参见 ?getDTthreads)。 最新的消息:r-datatable.com ********** Running data.table in English; package support is available in English only. When searching for online help, be sure to also check for the English error message. This can be obtained by looking at the po/R-<locale>.po and po/<locale>.po files in the package source, where the native language and English error messages can be found side-by-side. You can also try calling Sys.setLanguage('en') prior to reproducing the error message. ********** 载入程序包:‘data.table’ The following objects are masked from ‘package:dplyr’: between, first, last The following objects are masked from ‘package:S4Vectors’: first, second > library(Matrix) # Sparse matrices 载入程序包:‘Matrix’ The following object is masked from ‘package:S4Vectors’: expand > library(here) # Enhanced file referencing in project-oriented workflows here() starts at /data1/firefox/GSE277782_Run5961_PDAC_Slide1 > library(vecsets) # Enhanced version of the Set Operations from "base" 错误于library(vecsets): 存在叫‘vecsets’这个名称的程序包 > BiocManager::install("vecsets") 'getOption("repos")' replaces Bioconductor standard repositories, see 'help("repositories", package = "BiocManager")' for details. Replacement repositories: CRAN: https://cloud.r-project.org Bioconductor version 3.20 (BiocManager 1.30.25), R 4.4.3 (2025-02-28) Installing package(s) 'vecsets' 还安装依赖关系‘pracma’ 试开URL’https://cloud.r-project.org/src/contrib/pracma_2.4.4.tar.gz' Content type 'application/x-gzip' length 397815 bytes (388 KB) ================================================== downloaded 388 KB 试开URL’https://cloud.r-project.org/src/contrib/vecsets_1.4.tar.gz' Content type 'application/x-gzip' length 5714 bytes ================================================== downloaded 5714 bytes * installing *source* package ‘pracma’ ... ** 成功将‘pracma’程序包解包并MD5和检查 ** using staged installation ** R ** data *** moving datasets to lazyload DB ** demo ** byte-compile and prepare package for lazy loading ** help *** installing help indices ** building package indices ** testing if installed package can be loaded from temporary location ** testing if installed package can be loaded from final location ** testing if installed package keeps a record of temporary installation path * DONE (pracma) * installing *source* package ‘vecsets’ ... ** 成功将‘vecsets’程序包解包并MD5和检查 ** using staged installation ** R ** byte-compile and prepare package for lazy loading ** help *** installing help indices ** building package indices ** testing if installed package can be loaded from temporary location ** testing if installed package can be loaded from final location ** testing if installed package keeps a record of temporary installation path * DONE (vecsets) 下载的程序包在 ‘/tmp/Rtmp5RH1TC/downloaded_packages’里 Installation paths not writeable, unable to update packages path: /usr/lib/R/library packages: boot, codetools, foreign, lattice, Matrix, mgcv, nlme, spatial Old packages: 'aplot', 'BiocManager', 'BiocParallel', 'bookdown', 'broom', 'Cairo', 'checkmate', 'cli', 'collections', 'colorspace', 'cols4all', 'commonmark', 'cowplot', 'credentials', 'crosstalk', 'curl', 'data.table', 'data.tree', 'dbplyr', 'dbscan', 'Deriv', 'diffobj', 'doBy', 'DT', 'dtplyr', 'evaluate', 'fastcluster', 'fields', 'fitdistrplus', 'forcats', 'fs', 'future', 'future.apply', 'gargle', 'generics', 'ggforce', 'ggfun', 'ggnetwork', 'ggnewscale', 'ggplotify', 'ggpubr', 'ggraph', 'ggridges', 'ggsci', 'ggtangle', 'gh', 'globals', 'googledrive', 'googlesheets4', 'haven', 'here', 'httpuv', 'httr2', 'igraph', 'later', 'logger', 'magick', 'magrittr', 'maps', 'miniUI', 'mockr', 'modeltools', 'msigdbr', 'nanoarrow', 'openssl', 'parallelly', 'patchwork', 'pbapply', 'pbkrtest', 'pheatmap', 'pillar', 'pkgbuild', 'pkgdown', 'pkgload', 'plotly', 'progressr', 'promises', 'ps', 'psych', 'purrr', 'R.cache', 'R.oo', 'ragg', 'Rcpp', 'RcppArmadillo', 'RcppParallel', 'reformulas', 'ResidualMatrix', 'restfulr', 'reticulate', 'rlang', 'roxygen2', 'rprojroot', 'rsample', 'RSQLite', 'RUnit', 'rvest', 's2', 'sass', 'scatterpie', 'SCpubr', 'sctransform', 'SeuratObject', 'sf', 'shiny', 'spacesXYZ', 'spatstat', 'spatstat.data', 'spatstat.explore', 'spatstat.geom', 'spatstat.linnet', 'spatstat.model', 'spatstat.random', 'spatstat.univar', 'spatstat.utils', 'spdep', 'stringr', 'survminer', 'svglite', 'systemfonts', 'tensor', 'terra', 'textshaping', 'TH.data', 'tibble', 'tinytex', 'usethis', 'utf8', 'V8', 'vroom', 'waldo', 'xfun', 'xgboost', 'XML', 'xml2', 'yulab.utils', 'zip', 'zoo' Update all/some/none? [a/s/n]: n > library(vecsets) # Enhanced version of the Set Operations from "base" > library(dplyr) # For the use of pipes %>% > library(kableExtra) # For table formatting 错误于library(kableExtra): 存在叫‘kableExtra’这个名称的程序包 > BiocManager::install("kableExtra") 'getOption("repos")' replaces Bioconductor standard repositories, see 'help("repositories", package = "BiocManager")' for details. Replacement repositories: CRAN: https://cloud.r-project.org Bioconductor version 3.20 (BiocManager 1.30.25), R 4.4.3 (2025-02-28) Installing package(s) 'kableExtra' 试开URL’https://cloud.r-project.org/src/contrib/kableExtra_1.4.0.tar.gz' Content type 'application/x-gzip' length 1824636 bytes (1.7 MB) ================================================== downloaded 1.7 MB * installing *source* package ‘kableExtra’ ... ** 成功将‘kableExtra’程序包解包并MD5和检查 ** using staged installation ** R ** inst ** byte-compile and prepare package for lazy loading ** help *** installing help indices ** building package indices ** installing vignettes ** testing if installed package can be loaded from temporary location ** testing if installed package can be loaded from final location ** testing if installed package keeps a record of temporary installation path * DONE (kableExtra) 下载的程序包在 ‘/tmp/Rtmp5RH1TC/downloaded_packages’里 Installation paths not writeable, unable to update packages path: /usr/lib/R/library packages: boot, codetools, foreign, lattice, Matrix, mgcv, nlme, spatial Old packages: 'aplot', 'BiocManager', 'BiocParallel', 'bookdown', 'broom', 'Cairo', 'checkmate', 'cli', 'collections', 'colorspace', 'cols4all', 'commonmark', 'cowplot', 'credentials', 'crosstalk', 'curl', 'data.table', 'data.tree', 'dbplyr', 'dbscan', 'Deriv', 'diffobj', 'doBy', 'DT', 'dtplyr', 'evaluate', 'fastcluster', 'fields', 'fitdistrplus', 'forcats', 'fs', 'future', 'future.apply', 'gargle', 'generics', 'ggforce', 'ggfun', 'ggnetwork', 'ggnewscale', 'ggplotify', 'ggpubr', 'ggraph', 'ggridges', 'ggsci', 'ggtangle', 'gh', 'globals', 'googledrive', 'googlesheets4', 'haven', 'here', 'httpuv', 'httr2', 'igraph', 'later', 'logger', 'magick', 'magrittr', 'maps', 'miniUI', 'mockr', 'modeltools', 'msigdbr', 'nanoarrow', 'openssl', 'parallelly', 'patchwork', 'pbapply', 'pbkrtest', 'pheatmap', 'pillar', 'pkgbuild', 'pkgdown', 'pkgload', 'plotly', 'progressr', 'promises', 'ps', 'psych', 'purrr', 'R.cache', 'R.oo', 'ragg', 'Rcpp', 'RcppArmadillo', 'RcppParallel', 'reformulas', 'ResidualMatrix', 'restfulr', 'reticulate', 'rlang', 'roxygen2', 'rprojroot', 'rsample', 'RSQLite', 'RUnit', 'rvest', 's2', 'sass', 'scatterpie', 'SCpubr', 'sctransform', 'SeuratObject', 'sf', 'shiny', 'spacesXYZ', 'spatstat', 'spatstat.data', 'spatstat.explore', 'spatstat.geom', 'spatstat.linnet', 'spatstat.model', 'spatstat.random', 'spatstat.univar', 'spatstat.utils', 'spdep', 'stringr', 'survminer', 'svglite', 'systemfonts', 'tensor', 'terra', 'textshaping', 'TH.data', 'tibble', 'tinytex', 'usethis', 'utf8', 'V8', 'vroom', 'waldo', 'xfun', 'xgboost', 'XML', 'xml2', 'yulab.utils', 'zip', 'zoo' Update all/some/none? [a/s/n]: n > library(kableExtra) # For table formatting 载入程序包:‘kableExtra’ The following object is masked from ‘package:dplyr’: group_rows > library(Seurat) # Seurat object > metadata <- read.csv( "Run5961_PDAC_Slide1_metadata_file.csv", header = TRUE) > exprMat <- read.csv("Run5961_PDAC_Slide1_exprMat_file.csv", row.names = 1 ) 错误于read.table(file = file, header = header, sep = sep, quote = quote, : 'row.names'里能有重复的名称 > exprMat <- read.csv("Run5961_PDAC_Slide1_exprMat_file.csv", header = TRUE) > head(fov_positions) fov x_global_px y_global_px 1 31 -167790.5 60037.54 2 33 -168926.1 50800.38 3 35 -167131.8 36894.30 4 34 -166881.8 32628.33 5 30 -153631.6 35808.63 6 45 -143096.8 38916.08 > > metadata[1:6,1:6] fov cell_ID Area AspectRatio CenterX_local_px CenterY_local_px 1 1 1 10063 1.39 93 4209 2 1 2 2783 1.43 1214 4232 3 1 3 7246 2.34 2498 4223 4 1 4 8318 1.35 2769 4211 5 1 5 4371 1.10 3226 4221 6 1 6 6603 1.41 3009 4217 > > cells_0 <- grep("_0$", rownames(exprMat), value = TRUE) > > negPrb_col <- grep("^Neg", colnames(exprMat), value = TRUE) # Neg columns > > sysCon_col <- grep("^SystemControl", colnames(exprMat), value = TRUE) # SystemControl columns > > as.matrix(exprMat[1:6, 1:10]) fov cell_ID RAMP2 CD83 RYK CD5L NLRP2 BIRC5 LIF H2AZ1 1 1 0 13 59 36 33 20 26 54 84 2 1 1 0 0 1 1 0 1 1 0 3 1 2 0 0 0 0 0 0 0 0 4 1 3 1 0 0 0 0 0 0 0 5 1 4 0 0 0 0 0 0 0 0 6 1 5 0 0 0 0 0 0 0 0
09-28
【四轴飞行器】非线性三自由度四轴飞行器模拟器研究(Matlab代码实现)内容概要:本文围绕非线性三自由度四轴飞行器模拟器的研究展开,重点介绍了基于Matlab的建模与仿真方法。通过对四轴飞行器的动力学特性进行分析,构建了非线性状态空间模型,并实现了姿态与位置的动态模拟。研究涵盖了飞行器运动方程的建立、控制系统设计及数值仿真验证等环节,突出非线性系统的精确建模与仿真优势,有助于深入理解飞行器在复杂工况下的行为特征。此外,文中还提到了多种配套技术如PID控制、状态估计与路径规划等,展示了Matlab在航空航天仿真中的综合应用能力。; 适合人群:具备一定自动控制理论基础和Matlab编程能力的高校学生、科研人员及从事无人机系统开发的工程技术人员,尤其适合研究生及以上层次的研究者。; 使用场景及目标:①用于四轴飞行器控制系统的设计与验证,支持算法快速原型开发;②作为教学工具帮助理解非线性动力学系统建模与仿真过程;③支撑科研项目中对飞行器姿态控制、轨迹跟踪等问题的深入研究; 阅读建议:建议读者结合文中提供的Matlab代码进行实践操作,重点关注动力学建模与控制模块的实现细节,同时可延伸学习文档中提及的PID控制、状态估计等相关技术内容,以全面提升系统仿真与分析能力。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值