2016-08-04 2 views
0

R에 매우 기본적인 IF 문을 쓰려고합니다. 같은 문제가있는 사람을 찾을 수있을 거라 생각했는데 죄송합니다. 이전에 해결 되었으면 죄송합니다.R : IF 객체가 TRUE 인 경우 객체를 할당하지 않음

변수/개체가 할당되었는지 확인하고 싶습니다. IF TRUE R 패키지의 일부인 함수를 실행하고 싶습니다. 우선은

FileAssignment <- function(x){ 
    if(exists("x")==TRUE){ 
    print("yes!") 
    x <- parse.vdjtools(x) 
    } else { print("Nope!")} 
} 

가 나는 기능을 실행

FILENAME <- "FILENAME.txt" 

X로 파일 이름을 지정 쓴

FileAssignment(FILENAME) 

내가 인쇄를 사용 ("예!") 및 인쇄 ("아니!" IF 문이 제대로 작동하는지 확인하십시오. 그러나 parse.vdjtools(x) 부분은 할당되지 않습니다. 이제 함수 밖에서 동일한 IF 문을 테스트했습니다.

if(exists("FILENAME1")==TRUE){ 
    FILENAME1 <- parse.vdjtools(FILENAME1) 
} 

이 방법이 효과적입니다. 함수는 {}을 사용하고 if 문도 사용하기 때문에 here이라고 읽습니다. 그래서 if 문에서 대괄호를 제거해야합니다.

FileAssignment <- function(x){ 
    if(exists("x")==TRUE) 
    x <- parse.vdjtools(x) 
    else { print("Nope!") 
} 

작동하지 않았습니다.

특정 parse.vdjtools(x) 함수와 관련이 있다고 생각하여 방금 x <- 20 인 x에 정상 값을 할당하려고했습니다. 또한 함수 내부에서 작동하지 않았지만 외부에서는 수행합니다.

+0

측면 포인트 x에 할당 될 수 있고, 좀 봐 '? missing' 대안'존재하도록()'이 경우이다. –

+0

실제로 무엇을 성취하려고하는지 완전히 명확하지 않습니다. 여하튼, 부작용으로 논리적 객체를 'TRUE'에 대해 테스트하는 것은 의미가 없습니다. '== TRUE' 부분을 제거하면 무의미합니다. –

답변

2

나는 당신이 습관화하려고하는 것을 정말로 모른다. 그러나 나는이 상황에서 exists의 사용이 잘못되었다고 말한다. x가 함수 안에 존재할 수 없다. 이 예제를 참조하십시오

# All this does is report if x exists 
f <- function(x){ 
     if(exists("x")) 
     cat("Found x!", fill = TRUE) 
    } 

f() 
f("a") 
f(iris) 

# All will be found! 

file.exists을 조사 하시겠습니까? 이것은 벡터화되어 있기 때문에 동시에 벡터 파일을 조사 할 수 있습니다.

1

당신이 묻는 질문은 당신이 생각하는 것보다 덜 사소한 것입니다. 이 원하는 동작을 얻기 위해 해결해야 두 지점이 있고, 특히 첫 번째는 다소 까다 롭습니다 : @NJBurgo 지적하고 변수 x이 항상 있기 때문에 함수 내에서 존재합니다 @KonradRudolph으로

  1. 함수의 인수입니다. 귀하의 경우에 따라서 exists() 함수는 변수 x이 정의되어 있는지 확인하지 않아야합니다. 대신 문자에 저장되어있는 x에 저장된 이름에 해당하는 변수가 인지 여부를 확인하는 데 사용해야합니다.

    deparse()의 조합 substitute() 사용하여 달성된다 : x 이후

    if (exists(deparse(substitute(x)))) { … 
    
  2. 함수의 범위에 의해서만 정의되어 상기 superassignment 연산자 <<-는 할당 된 값을 확인하는 데 필요한 것 x은 @thothai가 제안한 것처럼 함수 외부에 표시됩니다.그러나 기능에는 이러한 부작용이 없어야합니다. 이러한 종류의 프로그래밍 문제는 함수 본문 외부의 다른 컨텍스트에서 정의 될 수있는 x이라는 다른 변수와의 충돌 가능성과 함수가 수행하는 작업에 대한 명확성 부족을 포함합니다.

    더 좋은 방법은 return 변수에 값을 할당하는 것입니다.

    기능이 버전
    FileAssignment <- function(x){  
        if (exists(deparse(substitute(x)))) { 
        print("yes!") 
        return(parse.vdjtools(x)) 
        } else { 
        print("Nope!") 
        return(NULL)} 
    } 
    

    , x의 범위는 함수 본문에 한정되고, 함수는 측면이없는 이러한 두 측면을 결합

이 함수는 다음과 같이 재기록 될 수있다 효과. FileAssignment(a)의 반환 값은 a의 존재 여부에 따라 parse.vdjtools(a) 또는 NULL입니다. 함수 외부 가이 값

x <- FileAssignment(a) 
관련 문제