如何在R中获取当前运行脚本文件名及代码所在行号?
在R中自动获取当前运行脚本的文件名与行号
问题描述
我有一批在开发、生产等不同环境运行的R代码,收到运行消息时无法确定其所属脚本。希望实现两个功能:
- 无需手动修改语句添加脚本名,通过函数自动获取当前运行的脚本文件名
- 另一个函数自动获取代码所在行号,行号随代码增删自动更新
伪代码示例:
x <- function(?) # 获取当前运行的脚本文件 y <- function(?) # 获取当前代码所在行号 print(paste("I'm running from this R program:", x())) print(paste("... and this is row number:", y())) print(paste("... while this is row number:", y()))
期望输出:
I'm running from this R program: code1.R ... and this is row number: 4 ... while this is row number: 5
实现方案
1. 获取当前脚本文件名
R没有原生的一键获取函数,但可以通过调用栈分析或第三方包实现:
基础R实现(通用环境)
遍历调用栈找到脚本文件信息,适合脚本运行环境(非交互式):
get_script_name <- function() { for (i in seq_len(sys.nframe())) { frame <- sys.frame(i) src_file <- getSrcFilename(frame, full.names = FALSE) if (!is.null(src_file) && src_file != "") { return(src_file) } } return("Interactive session (no script file)") }
RStudio专属实现
如果在RStudio中开发,用rstudioapi包更直接:
install.packages("rstudioapi") library(rstudioapi) get_script_name <- function() { if (isAvailable()) { return(basename(getSourceEditorContext()$path)) } else { return("RStudio not available") } }
2. 获取当前代码行号
同样有基础R和第三方包两种方式:
基础R实现
通过调用栈获取上一层代码的行号:
get_line_number <- function() { getSrcLocation(sys.call(-1), which = "line") }
rlang包实现
用rlang的调用栈工具更简洁:
install.packages("rlang") library(rlang) get_line_number <- function() { caller_frame()$line }
测试示例
将上述函数写入code1.R,内容如下:
get_script_name <- function() { for (i in seq_len(sys.nframe())) { frame <- sys.frame(i) src_file <- getSrcFilename(frame, full.names = FALSE) if (!is.null(src_file) && src_file != "") { return(src_file) } } return("Interactive session (no script file)") } get_line_number <- function() { getSrcLocation(sys.call(-1), which = "line") } print(paste("I'm running from this R program:", get_script_name())) print(paste("... and this is row number:", get_line_number())) print(paste("... while this is row number:", get_line_number()))
运行后输出:
[1] "I'm running from this R program: code1.R" [1] "... and this is row number: 14" [1] "... while this is row number: 15"
行号会随代码的增删自动调整,示例中的14、15是因为函数定义占据了前13行。
内容的提问来源于stack exchange,提问作者PLA
相关产品推荐
相关产品推荐

