2016-08-24 2 views
2

주어진 함수의 기본값을로드하는 함수를 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을 사용하여 원하는 것을 얻을 수 있다는 것입니다.

이 괄호 사이에 쉼표의 경우에 맞게 내 시도는 다음과 같습니다

: 이제

\\(.*,.*\\) 

, 나는 내가 위에서 설명한 일을하는 방법을 검토 한 결과 그것은 앞서 부정적인 모습이 비슷한 것 같다 내가 필요한 것, 그래서 나는 이런 식으로하려고했습니다.

splitx <- strsplit(x, "(?!\\(.*,.*\\)(,)") 

그러나 R은 그것이 불법적 인 정규식이라고 알려줍니다. 인수에 perl = TRUE을 설정하면 동일한 문자열 만 반환됩니다. 어떤 도움이라도 대단히 감사 할 것입니다. 그리고 나는 분명히했기를 바랍니다!

+1

PCRE regex를 사용하면 다른 것들과 매치되는 것을 쉽게 할 수 있습니다 - ['strsplit (x, "\\ ([^]) + \\) (* SKIP) (* F) |,", perl = TRUE)'] (http://ideone.com/Cw6U5n). 그러나 여기에서 정규 표현식을 사용하여 눈먼 골목으로 향하지 않도록하십시오. –

+3

귀하의 질문은 귀하가 직면 한 문제보다 훨씬 광범위합니다. 'match.call()'이 목표에 더 빨리 도달 할 수 있다고 제안한다면 나는 짧게자를 것인가? –

+1

일부 검색은 자세한 내용을 찾을 수 있지만 여기에서 시작할 수 있습니다 : http://stackoverflow.com/questions/14397364/match-call-with-default-arguments –

답변

7

입니다.

함수 formals()은 함수의 형식 인수의 쌍 목록을 반환합니다. is.symbol()is.null()을 테스트하여 formals()의 결과를 사용할 수 있습니다. 기호가 아니고 널이 아닌 것은 기본값을 포함합니다.

get_default_args <- function(fun){ 
    x <- formals(fun) 
    w <- sapply(x, function(x)!is.symbol(x) && !is.null(x)) 
    x[w] 
} 

lm()에 그것을 시도 : 코멘트가을 사용하여 제안하는 것이

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") 

참고 :

get_default_args(lm) 
$method 
[1] "qr" 

$model 
[1] TRUE 

$x 
[1] FALSE 

$y 
[1] FALSE 

$qr 
[1] TRUE 

$singular.ok 
[1] TRUE 

는 함수에 그것을 시도 예를 들어

210. 이것은 당신을 위해 효과가있을 수도 있지만 효과가 없을 수도 있습니다. 그러나 match.call()은이라고 불리는 후 함수의 환경에서 인수가 인 반면, formals()은 언어 객체 자체를 평가합니다. 따라서 formals()을 사용할 때는 함수를 호출 할 필요가 없습니다.

+0

꽤 멋진 것들이며,'formals()'인자는 매우 유용합니다. 고마워! – giraffehere

+0

'match.call()'에 대한 나의 지원은 아마도 여기에서 유스 케이스를 오해 할 것입니다. 이 답변 ('formals()')은 OP가 얻고 자하는 것을 올바르게 처리한다고 생각합니다. 그리고 나에게서 upvote를 얻는 동안 공식적인 질문은 공식적으로 정규식에 관한 것이므로 아래에 답했습니다. –

+0

그래, 걱정마. Andrie는 질문보다 더 중요한 목표로 넘어 가고있었습니다. – giraffehere

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\")" 
+0

필자의 경우 'match.call'의 문제는 함수 내에서 사용해야하는 반면,이 함수 밖에서 사용하고 싶습니다. – giraffehere

+1

네, 거기서 당신의 목표를 오해했습니다. 'formals()'는 아마도 당신이 원한 접근법이지만, 여러분의 질문은 여전히 ​​정규 표현식에 관한 것이므로이 대답이됩니다. –

관련 문제