R에 객체 (변수)가 정의되어 있는지 확인하는 방법은 무엇입니까?


294

오류가 발생하지 않고 R에 일부 변수가 정의되어 있는지 확인하고 싶습니다. 어떻게해야합니까?

내 시도 (성공하지 않음) :

> is.na(ooxx)
Error: object 'ooxx' not found
> is.finite(ooxx)
Error: object 'ooxx' not found

감사!

답변:


448

당신이 원하는 exists():

R> exists("somethingUnknown")
[1] FALSE
R> somethingUnknown <- 42
R> exists("somethingUnknown")
[1] TRUE
R> 

3
@ Gavin & Dirk, 당신은 서로에게 너무 좋습니다 :) 유일한 해결책은 당신이 수락 할 동전 (P = 0.5 :-)의 동전을 던지는 것입니다! :-)
TMS

29
@tim 함수 안에 있다면 missing ()이 원하는 것입니다.
CousinCocaine

2
목록 요소를 확인하면 조금 까다로울 수 있습니다. stackoverflow.com/q/7719741
TMS

5
따옴표가 아닌 변수 이름을 사용하여 op가 원하는 것에 대해 어떻습니까?
tim

109

?exists"... 정의 됨"에 대한 정의는을 참조하십시오 . 예 :

> exists("foo")
[1] FALSE
> foo <- 1:10
> exists("foo")
[1] TRUE

7
당신은 52 초
이깁니다

9
@DirkEddelbuettel 글쎄, 만약 당신이 엄청나게 긴 객체 이름을 사용한다면 ;-)
Gavin Simpson

2
ㅎ 게시하기 전에 예제를 테스트 할 때 항상 Gavin 또는 Josh가 이미 대답했습니다.
마이 아사 우라

60

함수 안에 있다면 missing ()이 원하는 것입니다.

exchequer = function(x) {
    if(missing(x)){
        message("x is missing… :-(")
    }
}

exchequer()
x is missing… :-(

missing그러나 함수 인수에만 작동합니다. 당신은 할 수 없거나 foo <- function(x) {missing(x); missing(y)}얻을 것이다 foo(1) > Error in missing(y) : 'missing' can only be used for arguments.
Dannid

45

다른 사람들이 지적했듯이 찾고 있습니다 exists. existsR의 기본 패키지에서 사용 하는 이름을 사용하면 변수를 정의했는지 여부에 관계없이 true를 반환합니다.

> exists("data")
[1] TRUE

이 문제를 해결하려면 (Bazz가 지적한 바와 같이 ?exists) inherits인수를 사용하십시오 .

> exists("data", inherits = FALSE)
[1] FALSE

foo <- TRUE
> exists("foo", inherits = FALSE)
[1] TRUE

물론, 첨부 된 패키지의 네임 스페이스를 검색하고자한다면 이것도 짧습니다.

> exists("data.table")
[1] FALSE
require(data.table)
> exists("data.table", inherits = FALSE)
[1] FALSE
> exists("data.table")
[1] TRUE

이 문제를 해결할 수있는 유일한 방법 은 기본 패키지가 아닌 첨부 된 패키지를 검색하는 것입니다 .

any(sapply(1:(which(search() == "tools:rstudio") - 1L),
           function(pp) exists(_object_name_, where = pp, inherits = FALSE)))

교체 비교 _object_name_"data.table"( TRUE) 대를 "var"(FALSE )

(물론 RStudio를 사용하지 않는 경우 자동으로 연결된 첫 번째 환경은입니다 "package:stats")


2
inherits = FALSE면서, 논쟁을 사용 하면 지구 환경에서 사물을 격리시키는 것처럼 보입니다. 그 소리가 맞습니까?
CJB

1
@Bazz 당신이 맞습니다; 나는 이것을 대답으로 편집했다.
MichaelChirico

2
변수 이름 "data"를 사용하기 때문에이 주석은 더 높아야합니다. 존재하는 것을 사용하면 처음에 문제가 발생했습니다.
mzm

25

따옴표를 사용하지 않으려면 deparse(substitute())예제 섹션에서 찾은 트릭을 사용할 수 있습니다 ?substitute.

is.defined <- function(sym) {
  sym <- deparse(substitute(sym))
  env <- parent.frame()
  exists(sym, env)
}

is.defined(a)
# FALSE
a <- 10
is.defined(a)
# TRUE

1
당신은 또한 다음 force과 같은 함수에서 그것을 평가할 수 있습니다 :is.defined <- function(sym) class(try(sym, TRUE))!='try-error'
chinsoon12

1

큐잉 시스템에 의해 결과 배열이 작성된 경우와 같이 찾고자하는 변수의 이름을 정확히 모르는 상황이있을 수 있습니다. 이것들은 정규 표현을 기대하는 "ls"와 그 인수 "pattern"으로 해결할 수 있습니다.

"존재"기능은 다음과 같이 다시 구현할 수 있습니다.

exists <-function(variablename) {
   #print(ls(env=globalenv()))
   return(1==length(ls(pattern=paste("^",variablename,"$",sep=""),env=globalenv())))
}

이 답변을 준비하는 동안 함수 내에서 ls () 를 호출 할 때 환경 사양이 필요하다는 것에 약간 놀랐습니다 . 그래서, 고마워요, stackoverflow! "all.names"속성도 true로 설정해야하지만 생략해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.