来自?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
做了什么?
答案 0 :(得分:2)
Stibu's comment是一般问题的具体示例。 ?builtins
表示它直接从符号表中获取它返回的对象的名称(这是C符号表)。
builtins(TRUE)
返回所有可通过.Internal
调用的内置对象。但是,这并不意味着必须有任何函数为任何.Internal(foo(args, ...))
调用foo
。
Stibu给出了一个例子:内部函数可能不会被具有相同名称的R函数调用,就像许多通用函数的情况一样,默认方法调用.Internal
。
另一个例子是.addCondHands
和.addRestart
,分别由withCallingHandlers
和withRestarts
调用。
一个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。