R data.table包中点函数“.()”的实现

R data.table包中点函数“.()”的实现,r,function,data.table,R,Function,Data.table,从?data.table::data.table: 表达式“()”是list()的简写别名;他们都是说 同样的 但是,该功能在任何地方都找不到: data.table:::. get(name,envir=asNamespace(pkg),inherits=FALSE)中出错: 找不到对象“” 所以我假设输入是以某种方式解析的,它是如何完成的?我想在我自己的软件包中使用相同的功能 以下几点效果不错: test <- function(x) { eval(substitute(

?data.table::data.table

表达式“()”是list()的简写别名;他们都是说 同样的

但是,该功能在任何地方都找不到:

data.table:::.
get(name,envir=asNamespace(pkg),inherits=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

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
}

…太棒了!这个函数将产生我期望的输出:
精确地测试!这是几天前问的同一个
composer
软件包吗?的确,我对此很感兴趣,这让我震惊了
[[
对于向量来说是多余的,它可以用于很多有趣的事情。我想,
dplyr::n
也使用了类似的手法,它存在,但只包含
中止(“不应该直接调用此函数”)
我确信这是正确的
# [[1]]
# [1] "bar"
# 
# [[2]]
# [1] "baz"
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
}
if (!missing(j)) {
    jsub = replace_dot_alias(substitute(j))
    root = if (is.call(jsub)) as.character(jsub[[1L]])[1L] else ""