代码之家  ›  专栏  ›  技术社区  ›  Josh O'Brien

可以从[.data.table()中的浏览器查看.SD吗?

  •  17
  • Josh O'Brien  · 技术社区  · 13 年前

    在构造表达式以放入 j -的插槽 [.data.table 调用时,能够检查和处理的内容通常会很有帮助 .SD .

    这种天真的尝试行不通。。。

    library(data.table)
    DT = data.table(x=rep(c("a","b","c"),each=3), y=c(1,3,6), v=1:9)
    
    DT[, browser(), by=x]
    # Called from: `[.data.table`(DT, , browser(), by = x)
    Browse[1]> 
    Browse[1]> .SD
    # NULL data.table
    

    …即使一个名为 .SD(标准差) 以及与当前data.table子集相关的其他几个子集都存在于本地环境中

    Browse[1]> ls(all.names = TRUE)
    #  [1] ".BY"       ".GRP"      ".I"        ".iSD"      ".N"        ".SD"      
    #  [7] "Cfastmean" "mean"      "print"     "x"        
    Browse[1]> .N
    # [1] 3
    Browse[1]> .I
    # [1] 4 5 6
    

    使用 .I ,我可以查看类似+/-的内容 .SD(标准差) ,但如果能够直接访问其价值,那就太好了:

    Browse[1]> DT[.I]
    #    x y v
    # 1: b 1 4
    # 2: b 3 5
    # 3: b 6 6
    

    我的问题: 为什么的期望值 .SD(标准差) 无法从内部直接获得 browser() 呼叫(同时 , .N , .GRP .BY 是)?是否有其他方法可以获取 .SD(标准差) ?

    1 回复  |  直到 13 年前
        1
  •  17
  •   Josh O'Brien    13 年前

    根据Matthew Dowle的评论更新:

    事实证明 .SD 在内部,是指 全部的 j 计算表达式,包括那些没有显式引用的表达式 .SD(标准差) 完全用所有的 DT 的每个子集的列 数据传输时间 不便宜,从时间上看,所以 [.data.table() 除非真的需要,否则不会这么做。

    相反,它充分利用了R对自变量的懒惰评估,预览了未评估的 j 表达式,并且仅添加到 .SD(标准差) 其中引用的列。如果 .SD(标准差) 它本身被提及,它添加了所有 数据传输时间 的列。

    因此,要查看 .SD(标准差) ,只需在 j -表达。以下是众多有效的表达式之一:

    library(data.table)
    DT = data.table(x=rep(c("a","b","c"),each=3), y=c(1,3,6), v=1:9)
    
    ## This works
    DT[, if(nrow(.SD)) browser(), by=x]
    # Called from: `[.data.table`(DT, , if (nrow(.SD)) browser(), by = x)
    Browse[1]> .SD
    #    y v
    # 1: 1 1
    # 2: 3 2
    # 3: 6 3
    

    这里还有几个:

    DT[,{.SD; browser()}, by=x]
    DT[,{browser(); .SD}, by=x]  ## Notice that order doesn't matter
    

    亲眼目睹 .SD(标准差) 只加载 j -表达式,依次运行这些(键入 .SD(标准差) 当进入浏览器环境时,以及 Q 离开它并返回到正常的命令行):

    DT[, {.N * y ; browser()}, by=x]
    DT[, {v^2 ; browser()}, by=x]
    DT[, {y*v ; browser()}, by=x]