W R chciałbym pobrać listę zmiennych globalnych na końcu mojego skryptu i iterować po nich. Oto mój kod
#declare a few sample variables
a<-10
b<-"Hello world"
c<-data.frame()
#get all global variables in script and iterate over them
myGlobals<-objects()
for(i in myGlobals){
print(typeof(i)) #prints 'character'
}
Mój problem polega na tym, że typeof(i)
zawsze zwraca, character
nawet jeśli jest zmienna a
i c
nie jest zmienną znakową. Jak mogę uzyskać oryginalny typ zmiennej wewnątrz pętli for?
typeof()
podaje bardzo ogólną informację o tym, jak obiekt jest przechowywany w pamięci. W większości przypadków użycia, jeśli chcesz wiedzieć, dobre informacje o zmiennejx
, dostaniesz więcej przydatnych informacji zclass(x)
,is(x)
lubstr(x)
(w kolejności ile zapewniają one szczegółowo). Zobacz odpowiedź Erica poniżej, aby zobaczyć przykłady tego, cotypeof()
mówi: czynniki sąinteger
; listy, ramki danych, obiekty modeli, inne zaawansowane obiekty to po prostulist
...Odpowiedzi:
Aby
get
uzyskać wartość, a nie nazwę znaku obiektu, należy użyćls
:Alternatywnie, dla przedstawionego problemu możesz użyć
eapply
:źródło
get
ma swoich krytyków i wyobrażam sobie,eapply
że byłby szybszy niż interpretowana pętla. Ale jest tylko jeden sposób, aby się tego dowiedzieć ...Jak uzyskać typ zmiennej ukrytej pod obiektem globalnym:
Wszystko, czego potrzebujesz, znajduje się w podręczniku R dotyczącym podstawowych typów: https://cran.r-project.org/doc/manuals/R-lang.html#Basic-types
Twoje
object()
potrzeby muszą zostać spenetrowane,get(...)
zanim będziesz mógł zajrzeć do środka. Przykład:Jak uzyskać typ zmiennej, którą masz w R
R funkcja
typeof
ma nastawienie, aby dać Ci typ na maksymalnej głębokości, na przykład.Jak uzyskać klasę zmiennej, którą masz w R
R funkcja
class
ma nastawienie, aby dać Ci typ pojemnika lub struktura enkapsulacji swoich typów, na przykład.Pobierz dane
storage.mode
swojej zmiennejKiedy zmienna R jest zapisywana na dysku, układ danych zmienia się ponownie i nazywany jest danymi
storage.mode
. Funkcjastorage.mode(...)
ujawnia te informacje niskiego poziomu: patrz Tryb, klasa i typ obiektów R . Nie powinieneś martwić się o tryb przechowywania w R., chyba że próbujesz zrozumieć opóźnienia spowodowane rzutami / wymuszeniami w obie strony, które występują podczas przypisywania i odczytu danych do iz dysku.Ideologia wokół systemu typowania triady R:
System pisania kaczego w R ma w sobie niepewność. Jako analogię rozważmy ceramiczną filiżankę, która może być używana do przechowywania płynu lub jako pocisk, jak piłka do baseballu. Przeznaczenie kubka zależy od jego dostępnych właściwości i oddziałującej na nie funkcji. Ta płynność typu pozwala programistom na większą swobodę w przekierowywaniu dowolnego rodzaju danych wyjściowych z jednej funkcji do innej, a R dołoży wszelkich starań, aby spróbować czytać w twoich myślach i zrobić coś rozsądnego.
Chodzi o to, że gdy początkujący programiści piszą programy w języku R za pomocą ruchów Browna, tak jak to robią, próbują przekazać a
googah.blimflarg
do avehicle.subspaceresponder(...)
. Zamiast zwymiotować błąd typu, program R wykonuje gimnastykę, aby przekształcić typ, a następnie zrobić coś zaskakująco użytecznego. Początkujący programista umieszcza kod na swoim blogu i mówi: „Spójrz na tę niesamowitą rzecz, którą zrobiłem z 3 liniami kodu R! Nie mam pojęcia, skąd wie, co robić, ale tak jest!”źródło
Możesz użyć class (x), aby sprawdzić typ zmiennej. Jeśli wymaganiem jest sprawdzenie wszystkich zmiennych typu ramki danych, można użyć sapply (x, class).
źródło
Próbuję
class
itypeof
działa, ale wszystko zawodzi.źródło
Zaprojektowany, aby zasadniczo robić to, co chciałeś, oto jedna z moich zabawek z zestawu narzędzi:
źródło
lapply (your_dataframe, class) daje coś takiego:
$ tikr [1] "współczynnik"
$ Date [1] "Data"
$ Open [1] "numeryczne"
$ High [1] „numeryczne”
... itd.
źródło