我想在R中创建一个加载给定函数默认值的函数.为此,我在args函数上使用参数,并希望将其分解为函数的默认参数并将其加载到全局环境中.这需要一些正则表达式,并且已经碰到了这个我很难解决的问题.
这是一个示例函数:
myFunc <- function(a = 1, b = "hello world", c = c("Hello", "World")) {}
Run Code Online (Sandbox Code Playgroud)
我已经使用自己的函数将它归结为这一点:
x <- "a = 1, b = \"hello world\", c = c(\"Hello\", \"World\")"
Run Code Online (Sandbox Code Playgroud)
但是,我正在努力的是将函数参数拆分.我想在逗号上拆分,但是如果你有一个函数参数在默认值中有逗号(就像c参数那样),那么就会导致问题.我在想的是,如果有一种方法可以调用与逗号匹配的正则表达式,而不是在两个括号之间使用逗号,那么我可以使用strsplit该表达式来获取我想要的内容.
我试图匹配两个括号之间的逗号大小如下:
\\(.*,.*\\)
Run Code Online (Sandbox Code Playgroud)
现在,我已经研究了如何做我上面描述的内容,看起来像我需要的消极前瞻,所以我试图做这样的事情.
splitx <- strsplit(x, "(?!\\(.*,.*\\)(,)")
Run Code Online (Sandbox Code Playgroud)
但R告诉我这是一个非法的正则表达式.如果我perl = TRUE在参数中设置,它只返回相同的字符串.这里的任何帮助将不胜感激,我希望我已经清楚了!
我将尝试回答你的基本问题.
该函数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]
}
Run Code Online (Sandbox Code Playgroud)
尝试一下lm():
get_default_args(lm)
$method
[1] "qr"
$model
[1] TRUE
$x
[1] FALSE
$y
[1] FALSE
$qr
[1] TRUE
$singular.ok
[1] TRUE
Run Code Online (Sandbox Code Playgroud)
试试你的功能:
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")
Run Code Online (Sandbox Code Playgroud)
请注意,评论建议使用match.call().这可能会或可能不会为你工作,而match.call()评估的参数在被调用后,该函数的环境,而formals()评估语言对象本身.因此,使用时根本不需要调用该功能formals().