正则表达式选择逗号但不在括号之间

时间:2016-08-24 21:52:25

标签: regex r string

我想在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,它只返回相同的字符串。非常感谢任何帮助,我希望我已经清楚了!

2 个答案:

答案 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\")"