我想在R中创建一个加载给定函数默认值的函数。为此,我在函数上使用args
参数,并希望将其分解为函数的默认参数,并将其加载到全局环境中。这需要一些正则表达式,并且碰到了这个问题,我很难解决。
以下是一个示例函数:
myFunc <- function(a = 1, b = "hello world", c = c("Hello", "World")) {}
我已经使用自己的功能将它归结为此:
x <- "a = 1, b = \"hello world\", c = c(\"Hello\", \"World\")"
但是,我正在努力解决的问题是将函数参数分开。我想拆分逗号,但是如果你有一个函数参数在默认值中有一个逗号(就像c
参数那样),那么就会引发问题。我在想的是,如果有一种方法可以调用与逗号匹配的正则表达式,而不是在两个括号之间使用逗号,那么我可以使用strsplit
和该表达式来获得我想要的内容。 / p>
我尝试匹配两个括号之间的逗号大小如下:
\\(.*,.*\\)
现在,我已经研究了如何做我上面描述的内容,看起来像我需要的消极前瞻,所以我试图做这样的事情。
splitx <- strsplit(x, "(?!\\(.*,.*\\)(,)")
但是R告诉我这是一个非法的正则表达式。如果我在参数中设置perl = TRUE
,它只返回相同的字符串。非常感谢任何帮助,我希望我已经清楚了!
答案 0 :(得分:7)
我将尝试回答您的基本问题。
函数formals()
返回函数形式参数的pairlist。您可以通过测试formals()
和is.symbol()
来使用is.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()
时,您根本不需要调用该函数。
答案 1 :(得分:1)
虽然我不认为这是正确的方法(使用match.call()
在传递参数时提取参数),匹配的正则表达式
x <- "a = 1, b = \"hello world\", c = c(\"Hello\", \"World\")"
strsplit(x, ",(?![^()]*\\))", perl=TRUE)
#> [[1]]
#> [1] "a = 1" " b = \"hello world\"" " c = c(\"Hello\", \"World\")"