18 agosto, 2021

Selo DC

Funções genéricas

  • Funções genéricas são:
    • Funções no R
    • Funções primitivas
    • Funções de tipo (typeof) "closure", com chamada UseMethod

Como identificar funções genéricas

  • utils::isS3stdGeneric()
  • sloop::ftype()

Exemplos

# Funcoes do tipo "closure" que nao pertencem ao sistema S3
utils::isS3stdGeneric(data)
## [1] FALSE
sloop::ftype(data)
## [1] "function"
# Funcao generica S3 em funcoes do tipo "closure"
utils::isS3stdGeneric(mean)
## mean 
## TRUE
sloop::ftype(mean)
## [1] "S3"      "generic"

Exemplos

# funcoes primitivas e internas que nao pertencem ao sistema S3
utils::isS3stdGeneric(inherits)
## [1] FALSE
sloop::ftype(inherits)
## [1] "internal"
#-----
utils::isS3stdGeneric(unclass)
## [1] FALSE
sloop::ftype(unclass)
## [1] "primitive"
# funcoes genericas do sistema S3 que sao primitivas e internas
utils::isS3stdGeneric(length)
## [1] FALSE
sloop::ftype(length)
## [1] "primitive" "generic"
#--
utils::isS3stdGeneric(unlist)
## [1] FALSE
sloop::ftype(unlist)
## [1] "internal" "generic"

Funções (“closure”) genéricas

mean
## function (x, ...) 
## UseMethod("mean")
## <bytecode: 0x0000000008622dd8>
## <environment: namespace:base>

Funções primitivas/internas genéricas

  • Objeto .S3PrimitiveGenerics:
.S3PrimitiveGenerics
##  [1] "anyNA"          "as.character"   "as.complex"     "as.double"     
##  [5] "as.environment" "as.integer"     "as.logical"     "as.call"       
##  [9] "as.numeric"     "as.raw"         "c"              "dim"           
## [13] "dim<-"          "dimnames"       "dimnames<-"     "is.array"      
## [17] "is.finite"      "is.infinite"    "is.matrix"      "is.na"         
## [21] "is.nan"         "is.numeric"     "length"         "length<-"      
## [25] "levels<-"       "names"          "names<-"        "rep"           
## [29] "seq.int"        "xtfrm"
# Outras funcoes primitivas
(outros_obj_S3_primitivos <- c("[", "[[", "$", "[<-", "[[<-", "$<-"))
## [1] "["    "[["   "$"    "[<-"  "[[<-" "$<-"
# Outras funcoes internas nao primitivas
(outros_obj_S3_primitivos <- c("unlist", "cbind", "rbind", "as.vector"))
## [1] "unlist"    "cbind"     "rbind"     "as.vector"

Grupos genéricos

  • Grupos genéricos: Grupo Math, Grupo Ops, Grupo Summary e grupo Complex
  • Grupo Math:
    • abs, sign, sqrt, floor, ceiling, trunc, round, signif
    • exp, log, expm1, log1p, cos, sin, tan, cospi, sinpi, tanpi, acos, asin, atan, cosh, sinh, tanh, acosh, asinh, atanh
    • lgamma, gamma, digamma, trigamma
    • cumsum, cumprod, cummax, cummin
  • Grupo Ops:
    • "+", "-", "*", "/", "^", "%%", "%/%"
    • "&", "|", "!"
    • "==", "!=", "<", "<=", ">=", ">"

Grupos genéricos

  • Grupos genéricos: Grupo Math, Grupo Ops, Grupo Summary e grupo Complex
  • Grupo Summary:
    • all, any, sum, prod, min, max, range
  • Grupo Complex:
    • Arg, Conj, Im, Mod, Re

Como saber quais e quantas são as funções primitivas/internas?

# Todos os objetos do pacote 'base'
todosobj <- objects(baseenv(), all.names = TRUE); 
# Mostre apenas os primeiros (ver todos remova 'head')
head(todosobj)
## [1] "-"         "-.Date"    "-.POSIXt"  "!"         "!.hexmode" "!.octmode"
# Quantos objetos no pacote 'base'?
length(todosobj)
## [1] 1373

Como saber quais e quantas são as funções primitivas/internas?

# Quais sao funcoes primitivas?
objprimitivos <- todosobj[sapply(todosobj,  
                                 function(x) is.primitive(get(x, envir = baseenv())))]
# Mostre os primeiros (ver todos remova 'head')
head(objprimitivos)
## [1] "-"   "!"   "!="  "$"   "$<-" "%%"
# Quantos primitivos ('buitin' ou 'special')?
length(objprimitivos)
## [1] 204
# Quais sao primitivos genéricos (Sistema S3)?
ehPrimitivaGenerica <- function(primitiva) {
  fprimitiva <- getFunction(primitiva, mustFind = FALSE, where =asNamespace("base"))
  ehgenerica <- sloop::ftype(fprimitiva)
  if (any(ehgenerica == "generic")) {
    TRUE
  } else FALSE
}

Como saber quais e quantas são as funções primitivas/internas?

# Mostre os primeiros (ver todos remova 'head')
head(sapply(objprimitivos, ehPrimitivaGenerica))
##     -     !    !=     $   $<-    %% 
##  TRUE FALSE  TRUE  TRUE  TRUE  TRUE
# Quantas sao primitivas genericas?
sum(sapply(objprimitivos, ehPrimitivaGenerica))
## [1] 100

Bons estudos!