R : Copyright 2003, The R Development Core Team Version 1.7.0 Under development (unstable) (2003-03-14) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type `license()' or `licence()' for distribution details. R is a collaborative project with many contributors. Type `contributors()' for more information. Type `demo()' for some demos, `help()' for on-line help, or `help.start()' for a HTML browser interface to help. Type `q()' to quit R. > #### Which functions in R are .Primitive() / which should be ? > #### ------------------------------------------------------------ > #### M.Maechler, May, 1998. > #### > #### text was in ../doc/manual/primitive-funs.tex , now > #### ==> ../doc/manual/R-exts.texi "@appendix R (internal) ... > #### ~~~~~~~~~~~~~~~~~~~~~~~~~ > > bpos <- match("package:base",search()) > nn <- ls(pos=bpos) > length(nn) # 844 [R 0.62.0, March 25, 1998; 1067 R 0.64.0 March 1999] [1] 1636 > > is.primitive <- function (obj) is.function(obj) && is.null(args(obj)) > is.special <- function(obj) typeof(obj) == "special" > > Primf <- nn[sapply(nn, function(N) is.primitive(get(N, pos=bpos)))] > length(Primf) ## 195 R 0.62.0, March 25, 1998 [1] 151 > ## 132 R 0.62.2+ > Real.primitives <- + list( + specials = c("{", "(", "if", "for", "while", "repeat", "break", "next", + "return", "function", "quote", + "on.exit" ## on.exit(expression, add=F) has two arguments in S-plus ! + ), + language = c("$", "$<-", "@", "<-", "=", "<<-", "[", "[<-", "[[", "[[<-"), + arith = c("%%", "%*%", "%/%","*", "+", "-", "/", "^"), + logic = c("!", "&", "&&", "|", "||", + "<", "<=", "==", ">", ">=", "!="), + arithF = + c("sign", "abs", + "floor", "ceiling", "trunc", + "sqrt", + "exp", ## NOT: "log", + "cos", "sin", "tan", + "acos", "asin", "atan", ## Not: atan2 + "cosh", "sinh", "tanh", + "acosh","asinh","atanh", + "cumsum","cumprod", + "cummax", "cummin" + ), + arithC = c("Arg", "Conj", "Im", "Mod", "Re"), + + programming = + c("nargs", "missing", # actually args(.) could be as formal(.) + "interactive", + ".Primitive", ".Internal", ".External", ".Call", + ".External.graphics", ".Call.graphics", + ".C", ".Fortran", "symbol.C", "symbol.For", + "globalenv", "pos.to.env", "unclass", + "as.character", "as.environment", + ##maybe ? "gc", "gcinfo", + ## + "debug", "undebug", ".primTrace", ".primUntrace", + "browser", "proc.time", "gc.time", #"traceback", + ), + + language2= c(":", "~", "c", "list", #nomore (Sep.9,1998): "unlist", + # ".Alias", removed for 1.5.0 + "call", "as.call", "expression", "substitute", + "UseMethod", ## ? really ? + "standardGeneric", + "invisible", + ), + + language3= + c("environment<-", + "length", "length<-", + "class", "class<-", + "attr", # again + "attr<-", + "attributes", "attributes<-", + "dim", "dim<-", + "dimnames", "dimnames<-", + ## MM: "comment", "comment<-", + ## New data.frame code + ## "levels", "levels<-", + ## "codes", "codes<-", + ## "[.data.frame", "[<-.data.frame", + ## "[[.data.frame", "[[<-.data.frame" + ), + ) > real.primitives <- unlist(Real.primitives) > ##names(real.primitives) <- rep("",length(real.primitives)) > > !any(duplicated(real.primitives)) # TRUE [1] TRUE > all(real.primitives %in% Primf) # TRUE [1] TRUE > > "%w/o%" <- function(a,b) a[! a %in% b] ## a without b > > prim.f <- Primf %w/o% real.primitives > ## see below: contains the is.xxxx(.) funtions > length(prim.f) == length(Primf) - length(real.primitives)# TRUE [1] TRUE > > Specf <- Primf[iPsp <- sapply(Primf, function(N) is.special(get(N, pos=bpos)))] > length(Specf) ## 36 [ R 0.63 ] [1] 40 > Specf [1] "$" "$<-" "&&" ".Internal" "<-" [6] "<<-" "=" "@" "UseMethod" "[" [11] "[<-" "[[" "[[<-" "as.character" "attr<-" [16] "break" "browser" "c" "call" "dim" [21] "dim<-" "dimnames" "dimnames<-" "expression" "for" [26] "function" "if" "interactive" "missing" "nargs" [31] "next" "on.exit" "quote" "repeat" "return" [36] "substitute" "while" "{" "||" "~" > ## the non-"special" ones: > all("builtin" == sapply(Primf[!iPsp], function(N) typeof(get(N, pos=bpos)))) [1] TRUE > > > ncpf <- nchar(prim.f) > table(ncpf) ncpf 5 6 7 8 9 10 11 12 13 14 1 1 6 3 8 5 4 2 2 1 > prim.f[ncpf <= 6]# only is.na, is.nan [1] "is.na" "is.nan" > > ( prim.isf <- prim.f[p.isis <- substr(prim.f,1,2) == "is"] ) [1] "is.array" "is.atomic" "is.call" "is.character" [5] "is.complex" "is.double" "is.environment" "is.expression" [9] "is.finite" "is.function" "is.infinite" "is.integer" [13] "is.language" "is.list" "is.loaded" "is.logical" [17] "is.matrix" "is.na" "is.name" "is.nan" [21] "is.null" "is.numeric" "is.object" "is.pairlist" [25] "is.real" "is.recursive" "is.single" "is.symbol" > > length(prim.f2 <- prim.f[! p.isis]) # down to 87 [R 0.62.0, March 25, 1998] [1] 5 > # 61 [March 27] > # 43 [April 17]; 38 [April 22] > ##-> 0 [May 1, 1998] > > prim.f2 # character(0) --- none left! -- [1] ".subset" ".subset2" "oldClass" "oldClass<-" [5] "reg.finalizer" > > for(n in prim.f2) + cat(n," <- function(*) .Internal(",n,"(*))\n", sep="") .subset <- function(*) .Internal(.subset(*)) .subset2 <- function(*) .Internal(.subset2(*)) oldClass <- function(*) .Internal(oldClass(*)) oldClass<- <- function(*) .Internal(oldClass<-(*)) reg.finalizer <- function(*) .Internal(reg.finalizer(*)) >