Get type of all variables

后端 未结 6 744
我寻月下人不归
我寻月下人不归 2020-12-12 12:37

In R, I\'d like to retrieve a list of global variables at the end of my script and iterate over them. Here is my code

#declare a few sample variables
a<-1         


        
相关标签:
6条回答
  • 2020-12-12 13:20

    You can use class(x) to check the variable type. If requirement is to check all variables type of a data frame then sapply(x, class) can be used.

    0 讨论(0)
  • 2020-12-12 13:22

    How to get the type of variable when hidden underneath a global object:

    Everything you need is in the R manual on basic types: https://cran.r-project.org/doc/manuals/R-lang.html#Basic-types

    Your object() needs to be penetrated with get(...) before you can see inside. Example:

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

    How to get the type of variable you have in R

    The R function typeof has a bias to give you the type at maximum depth, for example.

    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
    

    How to get the class of a variable you have in R

    The R function class has a bias to give you the type of container or structure encapsulating your types, for example.

    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
    

    Get the data storage.mode of your variable

    When an R variable is written to disk, the data layout changes yet again, and is called the data's storage.mode. The function storage.mode(...) reveals this low level information: see Mode, Class, and Type of R objects. You shouldn't need to worry about R's storage.mode unless you are trying to understand delays caused by round trip casts/coercions that occur when assigning and reading data to and from disk.

    Ideology around R's triad typing system:

    R's duck typing system has uncertainty in it. As an analogy, consider a ceramic cup, it can be used to hold a liquid, or used as a projectile like a baseball. The purpose of the cup depends on it's available properties and the function acting upon it. This fluidity of type allows greater leeway for programmers to redirect any kind of output from one function into another function, and R will go to great lengths to try to read your mind and do something reasonable.

    The idea is that when newbie programmers write R programs via Brownian motion, as they will, they attempt to pass a googah.blimflarg into a vehicle.subspaceresponder(...). Instead of puking a type-error, the R program does gymnastics to transform the type and then do something surprisingly useful. The newbie programmer posts the code on his blog and says "look at this tremendous thing I did with 3 lines of R code! I have no idea how it knows what to do, but it does!"

    0 讨论(0)
  • 2020-12-12 13:25
    > 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
    

    I try class and typeof functions, but all fails.

    0 讨论(0)
  • 2020-12-12 13:27

    Designed to do essentially the inverse of what you wanted, here's one of my toolkit toys:

     lstype<-function(type='closure'){
    inlist<-ls(.GlobalEnv)
    if (type=='function') type <-'closure'
    typelist<-sapply(sapply(inlist,get),typeof)
    return(names(typelist[typelist==type]))
    }
    
    0 讨论(0)
  • 2020-12-12 13:30

    You need to use get to obtain the value rather than the character name of the object as returned by ls:

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

    Alternatively, for the problem as presented you might want to use eapply:

    eapply(.GlobalEnv,typeof)
    $x
    [1] "integer"
    
    $a
    [1] "double"
    
    $b
    [1] "character"
    
    $c
    [1] "list"
    
    0 讨论(0)
  • 2020-12-12 13:34

    lapply(your_dataframe, class) gives you something like:

    $tikr [1] "factor"

    $Date [1] "Date"

    $Open [1] "numeric"

    $High [1] "numeric"

    ... etc.

    0 讨论(0)
提交回复
热议问题