builtins(internal = TRUE)返回什么?

时间:2017-01-18 19:06:05

标签: r

来自?builtins

  

builtins(TRUE)返回内部函数名称的未排序列表,即列表中foo可以作为.Internal(foo(args ...))访问的列表。

我不明白要返回哪些功能。

我认为基础包中的所有closure函数都会调用.Internal()

然而,这两组并不匹配。

base_objects <- mget(
  ls(baseenv(), all.names = TRUE), 
  envir = baseenv()
)

internals <- names(
  Filter(
    assertive.types::is_internal_function,
    base_objects
  )
)
builtins_true <- builtins(internal = TRUE)
c(
  both = length(intersect(internals, builtins_true)),
  internals_not_builtins_true = length(setdiff(internals, builtins_true)),
  builtins_true_not_internals = length(setdiff(builtins_true, internals))
)
##                        both internals_not_builtins_true builtins_true_not_internals 
##                         288                         125                         226

我还认为它可能是R源代码中src/main/names.c中列出的值,并且肯定与此有一些重叠,但它并不完全是这个值列表。

builtins()时,internal = TRUE做了什么?

2 个答案:

答案 0 :(得分:2)

Stibu's comment是一般问题的具体示例。 ?builtins表示它直接从符号表中获取它返回的对象的名称(这是C符号表)。

builtins(TRUE)返回所有可通过.Internal调用的内置对象。但是,这并不意味着必须有任何函数为任何.Internal(foo(args, ...))调用foo

Stibu给出了一个例子:内部函数可能不会被具有相同名称的R函数调用,就像许多通用函数的情况一样,默认方法调用.Internal

另一个例子是.addCondHands.addRestart,分别由withCallingHandlerswithRestarts调用。

一个R函数也可能调用多个.Internal函数。我不知道这个例子是不是我的头脑。

答案 1 :(得分:1)

经过多次挖掘后,似乎函数列表是R_FunTab[] src/main/names.c对象中的所有内容,其中eval列的第二个数字为1。< / p>

这是一个检索它们的脚本。

library(stringi)
library(magrittr)
library(dplyr)

names.c <- readLines("https://raw.githubusercontent.com/wch/r-source/56a1b08b7282c5488acb71ee244098f4fd94f7c7/src/main/names.c")

fun_tab <- names.c[92:974] %>% 
  stri_replace_all_regex("^\\{", "") %>% 
  stri_replace_all_fixed("{PP", "PP") %>% 
  stri_replace_all_fixed("}},", "") %>% 
  stri_replace_all_fixed("\\t", "")
funs <- read.csv(text = fun_tab, header = FALSE, comment.char = "/")

cols <- names.c[86] %>% 
  stri_sub(4) %>% 
  stri_split_regex("\\t+") %>% 
  extract2(1) %>% 
  stri_trim()
colnames(funs) <- cols

funs$eval <- formatC(funs$eval, width = 3, flag = "0")

# Internal fns have 2nd digit of eval col == 1. See names.c[62:71]
internals <- funs %>% filter_(~ substring(eval, 2, 2) == 1)

我在检查时看到了细微的差异

setdiff(internals$printname, builtins(TRUE))
setdiff(builtins(TRUE), internals$printname)

例如,如果您没有运行Windows,则builtins(TRUE)不包含shell.exec(); mem.limits()最近才从R的devel分支中删除,因此它在builtins(TRUE)中显示为当前版本的R。