Tüm değişkenlerin türünü alın


118

R'de, betiğimin sonunda global değişkenlerin bir listesini almak ve bunların üzerinde yinelemek istiyorum. İşte kodum

#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'
}

Benim sorunum, değişken olmasına rağmen typeof(i)her zaman geri characterdönmesi ave ckarakter değişkenleri olmamasıdır. For döngüsü içinde orijinal değişken türünü nasıl elde edebilirim?


Bu soruyu okuyan kişilere not: typeof()nesnenin bellekte nasıl saklandığı hakkında çok genel bir bilgi verir. En kullanım durumları için, bir değişkene hakkında iyi bilgi öğrenmek istiyorsanız x, size daha yararlı bilgiler elde edersiniz class(x), is(x)ya str(x)(sağladıkları ne kadar ayrıntı sırasına göre). Bkz aşağıda Eric'in cevabını neyi örnekleri için typeof()söyler: faktörlerdir integer; listeler, veri çerçeveleri, model nesneleri, diğer gelişmiş nesneler sadece list...
Gregor Thomas

Yanıtlar:


109

Aşağıdakinin getdöndürdüğü şekliyle nesnenin karakter adı yerine değeri elde etmek için kullanmanız gerekir ls:

x <- 1L
typeof(ls())
[1] "character"
typeof(get(ls()))
[1] "integer"

Alternatif olarak, sunulan sorun için aşağıdakileri kullanmak isteyebilirsiniz eapply:

eapply(.GlobalEnv,typeof)
$x
[1] "integer"

$a
[1] "double"

$b
[1] "character"

$c
[1] "list"

Mükemmel çalışın. Nesneler () tarafından döndürülen değişken listesinde bulunabilecek birkaç büyük veri çerçevesinin türünü bulmak için get () kullanılırsa herhangi bir performans cezası olup olmadığını biliyor musunuz?

1
geteleştirmenleri var ve eapplyyorumlanmış bir döngüden daha hızlı olacağını tahmin ediyorum. Ama öğrenmenin tek bir yolu var ...
James

17

Global bir nesnenin altına gizlendiğinde değişken türü nasıl elde edilir:

İhtiyacınız olan her şey, temel türlerle ilgili R kılavuzunda bulunmaktadır: https://cran.r-project.org/doc/manuals/R-lang.html#Basic-types

Kişisel object()ihtiyaçlar ile nüfuz edilecek get(...)içeride görmeden önce. Misal:

a <- 10
myGlobals <- objects()
for(i in myGlobals){
  typeof(i)         #prints character
  typeof(get(i))    #prints integer
}

R'de sahip olduğunuz değişken türünü nasıl elde edersiniz?

Örneğin, R fonksiyonununtypeof size maksimum derinlikte tip vermek için bir eğilimi vardır.

library(tibble)

#expression              notes                                  type
#----------------------- -------------------------------------- ----------
typeof(TRUE)             #a single boolean:                     logical
typeof(1L)               #a single numeric with L postfixed:    integer
typeof("foobar")         #A single string in double quotes:     character
typeof(1)                #a single numeric:                     double
typeof(list(5,6,7))      #a list of numeric:                    list
typeof(2i)               #an imaginary number                   complex

#So far so good, but those who wish to keep their sanity go no further
typeof(5 + 5L)           #double + integer is coerced:          double
typeof(c())              #an empty vector has no type:          NULL
typeof(!5)               #a bang before a double:               logical
typeof(Inf)              #infinity has a type:                  double
typeof(c(5,6,7))         #a vector containing only doubles:     double
typeof(c(c(TRUE)))       #a vector of vector of logicals:       logical
typeof(matrix(1:10))     #a matrix of doubles has a type:       list

#Strangeness ahead, there be dragons: step carefully:
typeof(substr("abc",2,2))#a string at index 2 which is 'b' is:  character
typeof(c(5L,6L,7L))      #a vector containing only integers:    integer
typeof(c(NA,NA,NA))      #a vector containing only NA:          logical
typeof(data.frame())     #a data.frame with nothing in it:      list
typeof(data.frame(c(3))) #a data.frame with a double in it:     list
typeof(c("foobar"))      #a vector containing only strings:     character
typeof(pi)               #builtin expression for pi:            double

#OK, I'm starting to get irritated, however, I am also longsuffering:
typeof(1.66)             #a single numeric with mantissa:       double
typeof(1.66L)            #a double with L postfixed             double
typeof(c("foobar"))      #a vector containing only strings:     character
typeof(c(5L, 6L))        #a vector containing only integers:    integer
typeof(c(1.5, 2.5))      #a vector containing only doubles:     double
typeof(c(1.5, 2.5))      #a vector containing only doubles:     double
typeof(c(TRUE, FALSE))   #a vector containing only logicals:    logical

#R is really cramping my style, killing my high, irritation is increasing:
typeof(factor())         #an empty factor has default type:     integer
typeof(factor(3.14))     #a factor containing doubles:          integer
typeof(factor(T, F))     #a factor containing logicals:         integer
typeof(Sys.Date())       #builtin R dates:                      double
typeof(hms::hms(3600))   #hour minute second timestamp          double
typeof(c(T, F))          #T and F are builtins:                 logical
typeof(1:10)             #a builtin sequence of numerics:       integer
typeof(NA)               #The builtin value not available:      logical

#The R coolaid punchbowl has been spiked: stay frosty and keep your head low:
typeof(c(list(T)))       #a vector of lists of logical:         list
typeof(list(c(T)))       #a list of vectors of logical:         list
typeof(c(T, 3.14))       #a vector of logicals and doubles:     double
typeof(c(3.14, "foo"))   #a vector of doubles and characters:   character
typeof(c("foo",list(T))) #a vector of strings and lists:        list
typeof(list("foo",c(T))) #a list of strings and vectors:        list
typeof(TRUE + 5L)        #a logical plus an integer:            integer
typeof(c(TRUE, 5L)[1])   #The true is coerced to 1              integer
typeof(c(c(2i), TRUE)[1])#logical coerced to complex:           complex
typeof(c(NaN, 'batman')) #NaN's in a vector don't dominate:     character
typeof(5 && 4)           #doubles are coerced by order of &&    logical
typeof(8 < 'foobar')     #string and double is coerced          logical
typeof(list(4, T)[[1]])  #a list retains type at every index:   double
typeof(list(4, T)[[2]])  #a list retains type at every index:   logical
typeof(2 ** 5)           #result of exponentiation              double
typeof(0E0)              #exponential lol notation              double
typeof(0x3fade)          #hexidecimal                           double
typeof(paste(3, '3'))    #paste promotes types to string        character
typeof(3 +)           #R pukes on unicode                    error
typeof(iconv("a", "latin1", "UTF-8")) #UTF-8 characters         character
typeof(5 == 5)           #result of a comparison:               logical

R'de sahip olduğunuz bir değişkenin sınıfını nasıl elde edebilirsiniz?

Örneğin, R işlevininclass size türlerinizi kapsayan kap veya yapı türü vermek için bir önyargısı vardır.

library(tibble)

#expression            notes                                    class
#--------------------- ---------------------------------------- ---------
class(matrix(1:10))     #a matrix of doubles has a class:       matrix
class(factor("hi"))     #factor of items is:                    factor
class(TRUE)             #a single boolean:                      logical
class(1L)               #a single numeric with L postfixed:     integer
class("foobar")         #A single string in double quotes:      character
class(1)                #a single numeric:                      numeric
class(list(5,6,7))      #a list of numeric:                     list
class(2i)               #an imaginary                           complex
class(data.frame())     #a data.frame with nothing in it:       data.frame
class(Sys.Date())       #builtin R dates:                       Date
class(sapply)           #a function is                          function
class(charToRaw("hi"))  #convert string to raw:                 raw
class(array("hi"))      #array of items is:                     array

#So far so good, but those who wish to keep their sanity go no further
class(5 + 5L)           #double + integer is coerced:          numeric
class(c())              #an empty vector has no class:         NULL
class(!5)               #a bang before a double:               logical
class(Inf)              #infinity has a class:                 numeric
class(c(5,6,7))         #a vector containing only doubles:     numeric
class(c(c(TRUE)))       #a vector of vector of logicals:       logical

#Strangeness ahead, there be dragons: step carefully:
class(substr("abc",2,2))#a string at index 2 which is 'b' is:  character
class(c(5L,6L,7L))      #a vector containing only integers:    integer
class(c(NA,NA,NA))      #a vector containing only NA:          logical
class(data.frame(c(3))) #a data.frame with a double in it:     data.frame
class(c("foobar"))      #a vector containing only strings:     character
class(pi)               #builtin expression for pi:            numeric

#OK, I'm starting to get irritated, however, I am also longsuffering:
class(1.66)             #a single numeric with mantissa:       numeric
class(1.66L)            #a double with L postfixed             numeric
class(c("foobar"))      #a vector containing only strings:     character
class(c(5L, 6L))        #a vector containing only integers:    integer
class(c(1.5, 2.5))      #a vector containing only doubles:     numeric
class(c(TRUE, FALSE))   #a vector containing only logicals:    logical

#R is really cramping my style, killing my high, irritation is increasing:
class(factor())       #an empty factor has default class:      factor
class(factor(3.14))   #a factor containing doubles:            factor
class(factor(T, F))   #a factor containing logicals:           factor
class(hms::hms(3600)) #hour minute second timestamp            hms difftime
class(c(T, F))        #T and F are builtins:                   logical
class(1:10)           #a builtin sequence of numerics:         integer
class(NA)             #The builtin value not available:        logical

#The R coolaid punchbowl has been spiked: stay frosty and keep your head low:
class(c(list(T)))       #a vector of lists of logical:         list
class(list(c(T)))       #a list of vectors of logical:         list
class(c(T, 3.14))       #a vector of logicals and doubles:     numeric
class(c(3.14, "foo"))   #a vector of doubles and characters:   character
class(c("foo",list(T))) #a vector of strings and lists:        list
class(list("foo",c(T))) #a list of strings and vectors:        list
class(TRUE + 5L)        #a logical plus an integer:            integer
class(c(TRUE, 5L)[1])   #The true is coerced to 1              integer
class(c(c(2i), TRUE)[1])#logical coerced to complex:           complex
class(c(NaN, 'batman')) #NaN's in a vector don't dominate:     character
class(5 && 4)           #doubles are coerced by order of &&    logical
class(8 < 'foobar')     #string and double is coerced          logical
class(list(4, T)[[1]])  #a list retains class at every index:  numeric
class(list(4, T)[[2]])  #a list retains class at every index:  logical
class(2 ** 5)           #result of exponentiation              numeric
class(0E0)              #exponential lol notation              numeric
class(0x3fade)          #hexidecimal                           numeric
class(paste(3, '3'))     #paste promotes class to string       character
class(3 +)           #R pukes on unicode                   error
class(iconv("a", "latin1", "UTF-8")) #UTF-8 characters         character
class(5 == 5)           #result of a comparison:               logical

storage.modeDeğişkeninizin verilerini alın

Bir R değişkeni diske yazıldığında, veri düzeni yine değişir ve verilerinstorage.mode adı verilir . İşlev storage.mode(...), bu düşük seviyeli bilgileri ortaya çıkarır: bkz. Mod, Sınıf ve R nesnelerinin Türü . Diske veri atarken ve diske veri okurken meydana gelen geri dönüşlü yayınların / zorlamaların neden olduğu gecikmeleri anlamaya çalışmıyorsanız, R'nin depolama modu hakkında endişelenmenize gerek yoktur.

R'nin üçlü yazım sistemi etrafındaki ideoloji:

R'nin ördek tipleme sisteminde belirsizlik var. Bir benzetme olarak, seramik bir kap düşünün, bir sıvıyı tutmak için kullanılabilir veya bir beyzbol gibi bir mermi olarak kullanılabilir. Bardağın amacı, mevcut özelliklerine ve ona etki eden işleve bağlıdır. Bu türdeki akışkanlık, programcıların herhangi bir çıktı türünü bir işlevden başka bir işleve yönlendirmek için daha fazla alan sağlar ve R, zihninizi okumaya ve mantıklı bir şey yapmaya çalışmak için büyük çaba sarf edecektir.

Fikir acemi programcılar Brown hareketi aracılığıyla R programları yazarken, öldürecekler, onlar bir pas girişiminde olmasıdır googah.blimflargbir içine vehicle.subspaceresponder(...). Bir tür hatasını kusmak yerine, R programı türü dönüştürmek için jimnastik yapar ve ardından şaşırtıcı derecede faydalı bir şey yapar. Yeni başlayan programcı, kodu blogunda yayınlıyor ve "3 satır R koduyla yaptığım şu muazzam şeye bakın! Ne yapacağını nasıl bildiğini bilmiyorum ama yapıyor!"


örneğin ds <- c (3,4,5,5,3) - "ds" nin tam olarak sayısal tür içeren vektör olduğu nasıl belirlenir?
Max Usanin

1
Araç kutunuzda x parametresini alan kendi özel R işlevinizi oluşturun. İşlevin içinde, typeof (x) 'in sayısal olup olmadığını ve sınıf (x)' in bir vektör olup olmadığını kontrol etmek için if ifadelerini kullanın. Öyleyse, dizeyi yazdırın: "x tam olarak sayısal türde bir vektördür". R bu bölümde size yardımcı olmayacak çünkü bu üçlü tipleme sistemi sonsuz karmaşıklığa sahip, tip analizi imkansız, siz tüm türleri tanımladığınız anda birisi yeni bir tane tanımlıyor. R yazma sistemi, herhangi bir dilde gördüğüm en kötüsü. Bu bir çöp sahası yangını.
Eric Leschinski

6

Değişken türünü kontrol etmek için sınıf (x) kullanabilirsiniz. Gereklilik, bir veri çerçevesinin tüm değişken türünü kontrol etmekse, sapply (x, class) kullanılabilir.


4
> mtcars %>% 
+     summarise_all(typeof) %>% 
+     gather
    key  value
1   mpg double
2   cyl double
3  disp double
4    hp double
5  drat double
6    wt double
7  qsec double
8    vs double
9    am double
10 gear double
11 carb double

Deniyorum classve çalışıyorum typeofama hepsi başarısız oluyor.


1

Esasen istediğiniz şeyin tersini yapmak için tasarlanan alet çantası oyuncaklarımdan biri:

 lstype<-function(type='closure'){
inlist<-ls(.GlobalEnv)
if (type=='function') type <-'closure'
typelist<-sapply(sapply(inlist,get),typeof)
return(names(typelist[typelist==type]))
}

0

lapply (your_dataframe, class) size şöyle bir şey verir:

$ tikr [1] "faktör"

$ Tarih [1] "Tarih"

$ Open [1] "sayısal"

$ Yüksek [1] "sayısal"

... vb.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.