获取所有variables的types
在R中,我想在脚本结尾检索一个全局variables列表,然后遍历它们。 这是我的代码
#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' }
我的问题是typeof(i)
总是返回character
即使variablesa
和c
不是字符variables。 如何获得for循环内的原始types的variables?
您需要使用get
来获取值,而不是由ls
返回的对象的字符名称:
x <- 1L typeof(ls()) [1] "character" typeof(get(ls())) [1] "integer"
或者,对于所提出的问题,您可能想要使用eapply
:
eapply(.GlobalEnv,typeof) $x [1] "integer" $a [1] "double" $b [1] "character" $c [1] "list"
如何获得你有的variables的types:
在get(...)
需要穿透的object()
的返回值附近有一个包装,例如:
a <- 10 myGlobals <- objects() for(i in myGlobals){ typeof(i) #prints character typeof(get(i)) #prints integer }
R如何获得你有的variables的types:
#A variable's type in R will shock and amaze you, lets start out #pretending that the builtin function `typeof` is sufficient for our needs: 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获得variables的类 :
#variable classes are similar but different to their types: 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
对于“Rtypes如何工作”的源代码级别答案,请参阅: https : //stat.ethz.ch/R-manual/R-devel/library/base/html/typeof.html
devise本质上与你想要的相反,这是我的一个工具包玩具:
lstype<-function(type='closure'){ inlist<-ls(.GlobalEnv) if (type=='function') type <-'closure' typelist<-sapply(sapply(inlist,get),typeof) return(names(typelist[typelist==type])) }
您可以使用class(x)来检查variablestypes。 如果需要检查dataframe的所有variablestypes,则可以使用sapply(x,class)。