debugging 在不调用函数的情况下,在R中Declare所有函数参数

uxhixvfz  于 2023-10-24  发布在  其他
关注(0)|答案(1)|浏览(103)

我想要一个函数,我抛出任何给定的其他函数,多个参数,使用单引号和双引号。
举例来说:

  1. just_params("some_function(param1="this",param2='that')")
  2. just_params(some_function(param1="this",param2='that'))
    这导致函数没有被调用,但在环境中声明了两个新的字符串变量param1和param2。两个选项都可以,但我认为#1会更容易。
    直接把这些都放到一个字符串中是很坚韧的,因为它混合了双引号和单引号。我希望在调试其他人的代码时使用它,我假设他们正在使用双引号和单引号。
    是的,我知道我可以复制和删除逗号,但有时我调试20个参数的函数调用(也畏缩,我知道),但这就是它,我不想去复制,粘贴和删除逗号每一次。
g52tjvyc

g52tjvyc1#

这里有一个方法:

just_params <- function(call) {
  # Get the expression that was in the call without evaluating it.
  
  call <- substitute(call)
  
  # Expand all arguments to their full names.  This needs the
  # called function to exist and be visible to our caller.
  
  call <- match.call(get(call[[1]], mode = "function", 
                         envir = parent.frame()), 
                     call)
  
  # Change the name of the function to "list" to return the arguments
  
  call[[1]] <- `list`
  
  # Evaluate it in the parent frame
  
  eval(call, envir = parent.frame())
}

some_function <- function(param1, param2, longname) {}

just_params(some_function(param1 = "this", param2 = 'that', long = 1 + 1))
#> $param1
#> [1] "this"
#> 
#> $param2
#> [1] "that"
#> 
#> $longname
#> [1] 2

创建于2023-09-03带有reprex v2.0.2
备注:

  • 如果调用缩写了一个名称,您将看到完整的名称(示例中使用long而不是longname
  • 如果调用使用了一个表达式,它将被计算(示例使用了1 + 1,但返回了2)。
  • 不保留报价的类型。

相关问题