Chciałbym sprawdzić, czy jakaś zmienna jest zdefiniowana w R - bez błędu. W jaki sposób mogę to zrobić?
Moje próby (nieudane):
> is.na(ooxx)
Error: object 'ooxx' not found
> is.finite(ooxx)
Error: object 'ooxx' not found
Dzięki!
Chcesz exists()
:
R> exists("somethingUnknown")
[1] FALSE
R> somethingUnknown <- 42
R> exists("somethingUnknown")
[1] TRUE
R>
Zobacz
?exists
definicję „... jest zdefiniowane”. Na przykładźródło
jeśli jesteś w funkcji, brak () jest tym, czego chcesz.
źródło
missing
działa jednak tylko dla argumentów funkcji. Nie możesz tego zrobićfoo <- function(x) {missing(x); missing(y)}
albo dostanieszfoo(1)
> Error in missing(y) : 'missing' can only be used for arguments
.Jak zauważyli inni, szukasz
exists
. Należy pamiętać, że użycieexists
z nazwami używanymi przez pakiety podstawowe R zwróci wartość true niezależnie od tego, czy zmienna została zdefiniowana:Aby obejść ten problem (jak wskazał Bazz; patrz
?exists
), użyjinherits
argumentu:Oczywiście, jeśli chcesz przeszukiwać przestrzenie nazw dołączonych pakietów, byłoby to również niewystarczające:
Jedyne, co mogę wymyślić, aby to obejść - szukać w załączonych pakietach, ale nie w pakietach podstawowych - to:
Porównaj wymianie
_object_name_
z"data.table"
(TRUE
) vs"var"
(FALSE
)(oczywiście, jeśli nie korzystasz z RStudio, myślę, że pierwszym automatycznie podłączonym środowiskiem jest
"package:stats"
)źródło
inherits = FALSE
wydaje się izolować rzeczy w globalnym środowisku. Czy to brzmi dobrze?Jeśli nie chcesz używać cudzysłowów, możesz użyć
deparse(substitute())
sztuczki, którą znalazłem w przykładowej sekcji?substitute
:źródło
force
lub ocenić to w funkcji takiej jak ta:is.defined <- function(sym) class(try(sym, TRUE))!='try-error'
Mogą wystąpić sytuacje, w których nie znasz dokładnie nazwy szukanej zmiennej, na przykład gdy tablica wyników została utworzona przez system kolejkowania. Można je rozwiązać za pomocą „ls” i jego argumentu „wzorzec”, który oczekuje wyrażenia regularnego.
Funkcję „istnieje” można ponownie zaimplementować w ten sposób jako
Przygotowując tę odpowiedź, byłem nieco zaskoczony potrzebą specyfikacji środowiska podczas wywoływania ls () z funkcji. Dziękuję za to, przepełnienie stosu! Istnieje również atrybut „all.names”, który powinienem był ustawić na true, ale go pominąłem.
źródło