检查函数体是否引用了不是参数的符号(形式)

Check if function body references symbols that are not arguments (formals)

我正在实现一个带有许多参数的长函数,并意识到函数体引用了一个不是参数的变量(符号)(即调用签名中不包含形式),但该函数正在静默失败,因为该变量存在于全球环境中。这当然是初学者的常见问题,但有时也会是更有经验的用户。

有没有办法以编程方式或通过流行的 UI(例如 RStudio)中可用的工具来快速检查函数的模块化?

当然可以实施单元测试,并且通常在编写脚本时要小心,但测试对于仅用于部分简短项目的功能来说是过大的,并且描述的工具在编写更长/更复杂的脚本时会很有用。

我在以下片段中提取了核心思想,其中问题是有效的:How can the presence of z in the function body of add_three_numbers be quickly, easily and ideally automatically identified ?

z <- 2

add_three_numbers <- function(x, y) {
  x + y + z
}

add_three_numbers(1, 2)

例如,我设想了一个函数,它解析函数体并将其中找到的一组符号与构成该函数的形式参数的符号列表区分开来,如果以编程方式执行此操作,或者 RStudio 中的函数以某种方式达到相同的结果。

如果您的代码在包中,

R CMD check 会为您执行此操作。如果你不使用包,你应该。测试使用codetools::findGlobals。例如,

add_three_numbers <- function(x, y) {
  x + y + z
}

codetools::findGlobals(add_three_numbers, merge = FALSE)
#> $functions
#> [1] "{" "+"
#> 
#> $variables
#> [1] "z"

reprex package (v2.0.1.9000)

创建于 2022-02-09