我想在 R 中创建一个函数来加载给定函数的默认值。为此,我在函数上使用了 args
参数,并希望将其分解为函数的默认参数并将它们加载到全局环境中。这需要一些正则表达式,并且遇到了我难以解决的问题。
这是一个示例函数:
myFunc <- function(a = 1, b = "hello world", c = c("Hello", "World")) {}
我已经使用我自己的函数将其归结为这一点:
x <- "a = 1, b = \"hello world\", c = c(\"Hello\", \"World\")"
但是,我遇到困难的地方在于拆分函数参数。我想用逗号分割,但如果你有一个函数参数,它在默认值中有一个逗号(就像 c
参数那样),那么这会导致问题。我在想的是,如果有一种方法可以调用匹配逗号的正则表达式,而不是两个括号之间的逗号 this,那么我可以将 strsplit
与该表达式一起使用来获得我想要的想要。
我尝试匹配两个括号之间逗号的大小写,如下所示:
\\(.*,.*\\)
现在,我研究了如何做我上面描述的事情,看起来消极的展望可能是我需要的,所以我尝试做这样的事情。
splitx <- strsplit(x, "(?!\\(.*,.*\\)(,)")
但是 R 告诉我这是一个非法的正则表达式。如果我在参数中设置 perl = TRUE
,它只会返回相同的字符串。非常感谢此处的任何帮助,我希望我已经说清楚了!
最佳答案
我将尝试回答您的基本问题。
函数 formals()
返回函数形式参数的对列表。您可以通过测试 is.symbol()
和 is.null()
来使用 formals()
的结果。任何不是符号且也不为 null 的东西都包含一个默认值。
例如:
get_default_args <- function(fun){
x <- formals(fun)
w <- sapply(x, function(x)!is.symbol(x) && !is.null(x))
x[w]
}
在 lm()
上试试:
get_default_args(lm)
$method
[1] "qr"
$model
[1] TRUE
$x
[1] FALSE
$y
[1] FALSE
$qr
[1] TRUE
$singular.ok
[1] TRUE
在你的函数上试试:
myFunc <- function(a = 1, b = "hello world", c = c("Hello", "World")) {}
get_default_args(myFunc)
$a
[1] 1
$b
[1] "hello world"
$c
c("Hello", "World")
请注意,注释建议使用 match.call()
。这可能对您有用,也可能不适合您,但是 match.call()
会在被调用后在函数的环境中计算参数,而 formals()
评估语言对象本身。因此,在使用 formals()
时根本不需要调用该函数。
关于regex - 正则表达式选择逗号但不在括号之间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39133597/