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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 17:46:07