如何在不破坏data.table的自定义评估的情况下调整[.data.table`中的j?

Dothatrumba

我正在尝试扩展data.table加快/标准化复杂调查设计的分析为此,我尝试[.data.table在拦截呼叫位置上添加一个浅层,j并在某些情况下在需要特殊测量类型命令时替换操作(例如meanto median)(或在特殊命令类型时使用常规功能)无需利用data.table的geforce类型优化)。

基于我对s3调度的部分理解,NextMethod应该是这里合适的功能,但是它似乎正在j作为符号传递j(例如,a[, j]代替a[, median(v1)]它与data.table的NSE进行了怪异的交互。我已经尝试了使用do.call的版本,但是不会经过一些无限递归的废话(do.call('[', ...)将无休止地调度[.dtsurvey

有没有一种干净的方法来调整参数并将其传递给data.table在下面的玩具示例中,即使初始操作为,我也希望调用返回mediancolumn的v1mean

library('data.table')

a = data.table(v1 = 1:10)
b = copy(a)

"[.dtsurvey" <- function(x, i, j, by, ...){
  
  j = substitute(j)
  print(j)
  if(j[[1]] == 'mean') j[[1]] = quote(median)
  print(j)

  NextMethod(`[`, x)
}
class(a) <- c('dtsurvey', class(a))
a[, mean(v1)]
#> mean(v1)
#> median(v1)
#> Error in `[.data.table`(a, , mean(v1)): j (the 2nd argument inside [...]) is a single symbol but column name 'j' is not found. Perhaps you intended DT[, ..j]. This difference to data.frame is deliberate and explained in FAQ 1.1.

reprex软件包(v0.3.0)创建于2020-10-08

Moody_Mudskipper

我认为您无法在此处利用NextMethod,据我所知,它在传递参数时会考虑这些参数。这是一种方法:

library(data.table)
a = data.table(v1 = c(1,2,9))
b = copy(a)

"[.dtsurvey" <- function(x, i, j, by, ...){
  mc <- match.call()
  j <- substitute(j)
  j <- do.call(substitute, list(j, list(mean = quote(median))))
  mc[["j"]] <- j
  mc[[1]] <- quote(data.table:::`[.data.table`)
  eval.parent(mc)
}

class(a) <- c('dtsurvey', class(a))
a[, mean(v1)]
#> [1] 2
b[, mean(v1)]
#> [1] 4

reprex软件包(v0.3.0)创建于2020-10-08

或者:

"[.dtsurvey" <- function(x, i, j, by, ...){
  mc <- match.call()
  mc[["j"]] <- do.call(substitute, list(substitute(j), list(mean = quote(median))))
  mc[[1]] <- quote(`[`)
  mc[[2]] <- substitute(as.data.table(x))
  eval.parent(mc)
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在不破坏自动配置的情况下在Spring-Boot中自定义MappingMongoConverter(setMapKeyDotReplacement)?

data.table:j中的匿名函数

如何在R中的data.table中使用自定义函数

data.table 中的自定义嵌套排序

通过R中的data.table自定义广播

如何在没有自定义订阅者的情况下调整Combine的发布者需求?

对 data.table 中的多个 .SDcols 组执行 j

data.table分组列的长度为“ J”中的1

无法从data.table的“ j”参数中获得相同的结果

避免j中的data.table强制列表返回列

用j中的函数表示的data.table ..符号

如何在不删除其他列的情况下更新data.table中的预定义列列表?

在data.table中的j表达式中评估列名和目标值

如何在不丢失X上现有主键的情况下进行X [Y] data.table连接?

如何在data.table的j中正确使用ifelse()?

在Word中,如何在不更改表宽度的情况下调整列的大小?

如何使用“ by”并选择某些列在data.table中应用自定义函数

如何自定义v-data-table中的所有标头?

重复的列名称上的data.table合并/如何在Y中写入与名称相对应的J?

在 data.table 中,如何在 j 中使用 ifelse() 进行子集化并使用 .N 作为子集后的观察数?

R data.table 自定义函数

如何在data.table中获取prop.table?

根据data.table中列的最大值在dcast中自定义聚合函数?

如何在不评估变量的情况下将变量传递给自定义组件?

使用自定义函数对 data.table 中的子集使用 mapply

自定义函数中的R data.table grepl条件

在R中,自定义dcast.data.table创建的列的名称

如何在不破坏格式的情况下在 JSDoc 中编写包含 javascript 注释的模板文字?

如何在不破坏 <div> 的宽度或布局的情况下将 <div> 包裹在 <a> 中?