来自?data.table::data.table
:
表达式'。()'是list()的简写别名;他们都意味着 一样
但是找不到此功能:
data.table:::.
get(名称,envir = asNamespace(pkg),继承= FALSE)错误:
对象“。”找不到
所以我想以某种方式解析输入,如何完成?我想在自己的程序包中使用相同的功能。
以下作品还不错:
test <- function(x) {
eval(substitute(
eval.parent(substitute(x, list(.=list)))
))
}
foo <- "bar"
test(.(foo))
# [[1]]
# [1] "bar"
identical(test(.(foo)), list(foo))
# [1] TRUE
但是,在此点函数中将使用一些点变量,但失败了:
. <- "baz"
test(.(foo,.))
# [[1]]
# [1] "bar"
#
# [[2]]
# function (...) .Primitive("list")
预期:
# [[1]]
# [1] "bar"
#
# [[2]]
# [1] "baz"
答案 0 :(得分:7)
data.table
包通过这段代码来完成
replace_dot_alias <- function(e) {
# we don't just simply alias .=list because i) list is a primitive (faster to iterate) and ii) we test for use
# of "list" in several places so it saves having to remember to write "." || "list" in those places
if (is.call(e)) {
# . alias also used within bquote, #1912
if (e[[1L]] == 'bquote') return(e)
if (e[[1L]] == ".") e[[1L]] = quote(list)
for (i in seq_along(e)[-1L]) if (!is.null(e[[i]])) e[[i]] = replace_dot_alias(e[[i]])
}
e
}
在R/data.table.R
中找到(当前在第173行)。这就是为什么在任何地方都找不到data.table:::.
的原因,以及它们如何完成您在帖子中提到的解析。
然后在[.data.table" <- function (x, i, j,
中...他们可以做这种事情
if (!missing(j)) {
jsub = replace_dot_alias(substitute(j))
root = if (is.call(jsub)) as.character(jsub[[1L]])[1L] else ""
....