【问题标题】:implementation of dot function `.()` in data.table package [duplicate]data.table 包中点函数`.()`的实现[重复]
【发布时间】:2018-09-13 11:41:02
【问题描述】:

来自?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

但是在这个点函数内部会使用一些点变量,这会失败:

. <- "baz"
test(.(foo,.))
# [[1]]
# [1] "bar"
# 
# [[2]]
# function (...)  .Primitive("list")

预期:

# [[1]]
# [1] "bar"
# 
# [[2]]
# [1] "baz"

【问题讨论】:

    标签: r function data.table


    【解决方案1】:

    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" &lt;- function (x, i, j,...他们可以做这种事情

    if (!missing(j)) {
        jsub = replace_dot_alias(substitute(j))
        root = if (is.call(jsub)) as.character(jsub[[1L]])[1L] else ""
    

    ....

    【讨论】:

    • 太棒了!这个函数会产生我预期的输出:test &lt;- function(x) eval.parent(data.table:::replace_dot_alias(substitute(x)))
    • 没错!这是与几天前的问题相同的composer 包吗?
    • 确实,我对此感到很开心,我只是觉得[[ 对于向量来说是多余的,而且它可以用来做很多有趣的事情。
    • 我想dplyr::n 也使用了类似的手法,它存在但只包含abort("This function should not be called directly")
    • 我确定这是对的
    猜你喜欢
    • 2017-10-11
    • 2022-06-23
    • 2014-03-26
    • 2017-03-02
    • 1970-01-01
    • 2021-07-30
    • 1970-01-01
    • 2011-02-26
    • 1970-01-01
    相关资源
    最近更新 更多