R 强制计算data.table中的.SD

R 强制计算data.table中的.SD,r,data.table,lazy-evaluation,R,Data.table,Lazy Evaluation,为了调试data.table中的j,我更喜欢使用browser()交互式地检查-dt产生的-。解决了这个问题,我知道为了计算所有列,必须在j中调用.SD。我使用Rstudio和使用该方法时,存在两个问题: “环境”窗格不会更新以反映浏览器环境 我经常遇到以下错误消息 我可以通过以下方式解决这个问题: f <- function(sd=force(.SD),.env = parent.frame(n = 1)) { by = .env$.BY; i = .env$.I; sd =

为了调试data.table中的
j
,我更喜欢使用
browser()
交互式地检查
-dt产生的-
。解决了这个问题,我知道为了计算所有列,必须在
j
中调用.SD。我使用Rstudio和使用该方法时,存在两个问题:

  • “环境”窗格不会更新以反映浏览器环境
  • 我经常遇到以下错误消息
  • 我可以通过以下方式解决这个问题:

    f <- function(sd=force(.SD),.env = parent.frame(n = 1)) {
      by = .env$.BY;
      i = .env$.I;
      sd = .env$.SD;
      grp = .env$.GRP;
      N = .env$.N;
      browser()
    }
    library (data.table)
    
    setDT(copy(mtcars))[,f(.SD),by=.(gear)]
    
    据我所知,,
    data.table
    需要明确查看传递给
    j
    的代码中的
    .SD
    , 否则,它甚至不会在为执行而创建的环境中公开它。 例如,见

    为什么不创建一个不同的助手函数,它总是在
    j
    中指定
    .SD
    ? 比如:

    dt_debugger <- function(dt, ...) {
      f <- function(..., .caller_env = parent.frame()) {
        by <- .caller_env$.BY;
        i <- .caller_env$.I;
        sd <- .caller_env$.SD;
        grp <- .caller_env$.GRP;
        N <- .caller_env$.N;
        browser()
      }
    
      dt[..., j = f(.SD)]
    }
    
    dt_debugger(as.data.table(mtcars), by = .(gear))
    
    dtu调试器
    
    setDT(copy(mtcars))[,f(),by=.(gear)]
    
    dt_debugger <- function(dt, ...) {
      f <- function(..., .caller_env = parent.frame()) {
        by <- .caller_env$.BY;
        i <- .caller_env$.I;
        sd <- .caller_env$.SD;
        grp <- .caller_env$.GRP;
        N <- .caller_env$.N;
        browser()
      }
    
      dt[..., j = f(.SD)]
    }
    
    dt_debugger(as.data.table(mtcars), by = .(gear))