2014-06-24 2 views
3

함수에 인수로 전달 된 변수가 있는지 확인하려고합니다. this 질문에 대한 답변에 따라 나는 다음과 같은 한 :전달 된 인수가 있는지 확인하십시오.

myfunction <- function(x) { 
    stopifnot(exists(deparse(substitute(x)))) 
} 

을하지만, 작동하지 않는 인수가 평가 될 수있는 표현 인 경우 :

a=c(1:10) 
myfunction(a+10) 

어떻게 내가 캡처해야 할 수는 인수가 단순한 변수가 아닌 경우 존재하지 않는 변수?

+1

당신이 달성하려고하는 무엇을? – hadley

+0

@hadley 인수가 기존 객체로 평가되지 않는 상황을 처리하는 기능을 원합니다. 예를 들어'myfunction (get (ls() [3]))'은 객체를 전달할 수도 있고 전달하지 않을 수도 있습니다. 귀하의 의견을 보내 주셔서 감사합니다. – keszei

+0

그리고 왜 그렇게하고 싶습니까? – hadley

답변

1

하나의 옵션은 match.call (함수 호출을 반환 함)과 all.vars (식의 이름을 반환)을 결합합니다. 이 시도 : 마찬가지로

fcn <- function(x) { 
    varnames <- all.vars(match.call()) 
    for (x in varnames) 
    stopifnot(exists(x)) 
} 

fcn(a) # returns error, as expected 
#Error: exists(x) is not TRUE 

# create "a" 
a <- 2 
fcn(a + 1) # no error returned since "a" exists 

,

fcn(a + b) # error returned since "b" does not exist 
#Error: exists(x) is not TRUE 
b <- 4 
fcn(a + b) # no error since "b" now exists 
+0

좋은 해결책을 가져 주셔서 감사합니다. 호출에서 변수 a 또는 b가 나타나면 실제로 제대로 작동합니다. 그러나'fcn (get ("b"))'와 같이 호출하면 존재하지 않는 b를 포착하지 않습니다. – keszei

+0

제기 한이 새로운 사례는 나에게 또 다른 접근 방식을 제안합니다. 인수로 전달 된 표현식을 단순히 평가하려고하면 어떨까요? (eval (match [] [[2])))'와 같은 변수를 포함하고 있다면, 이것은 자연스럽게 오류를 리턴 할 것이다. – javlacalle

+0

예, 이것이 제가 찾고있는 것 같습니다. 고맙습니다. – keszei

관련 문제