r-将表达式作为参数提供给使用data.table联接的函数



我希望能够使用一个包含表达式的字符串作为函数的参数,以便与data.table连接。请参阅下文;

> library(data.table)
> 
> x <- data.table(Id  = c("A", "B", "C", "C"),
+                 X1  = c(1L, 3L, 5L, 7L),
+                 X2 = c(8L,12L,9L,18L),
+                 XY  = c("x2", "x4", "x6", "x8"))
> 
> z <- data.table(ID = "C", Z1 = 5:9, Z2 = paste0("z", 5:9))
> 
> 
> x[z, on = .(Id == ID), mult = "all", allow.cartesian=TRUE]
Id X1 X2 XY Z1 Z2
1:  C  5  9 x6  5 z5
2:  C  7 18 x8  5 z5
3:  C  5  9 x6  6 z6
4:  C  7 18 x8  6 z6
5:  C  5  9 x6  7 z7
6:  C  7 18 x8  7 z7
7:  C  5  9 x6  8 z8
8:  C  7 18 x8  8 z8
9:  C  5  9 x6  9 z9
10:  C  7 18 x8  9 z9
> 
> # Conversion to a function. Need to work out the piece - evaluate_string_to_correct_format
> data_table_join <- function(x,y,string){
+     
+     x[y, on = evaluate_string_to_correct_format(string),
+       mult = "all", allow.cartesian = TRUE]
+     
+ }

这里字符串应该等于";。(Id==Id(";我只是不知道如何达到它的效果。我希望能够用字符串替换data.table调用的多个部分,所以这只是一个最小的例子。

参数on可以在输入中采用字符向量,而不仅仅是表达式。所以你可以提供on="Id==ID"。对于多个条件,使用长度为2+的字符向量,如c("a==b","x==y")。此外,您应该在?data.table手册中找到有用的示例。

x[z, on = "Id==ID", mult = "all", allow.cartesian=TRUE]
x[z, on = c("Id==ID", "X1==Z1"), mult = "all", allow.cartesian=TRUE]

如果您不想使用字符串而是表达式,那么您需要在函数中substitute它。

data_table_join <- function(x,y,expr) {
eval(substitute(
x[y, on = .expr,
mult = "all", allow.cartesian = TRUE]
list(.expr = expr)
))
}

这就是NSE在R中的工作方式,请阅读更多R?substitute手册或R语言手册中的"语言计算"部分:https://cran.r-project.org/doc/manuals/R-lang.html#Computing-关于语言

至于data.table查询的其他部分的参数化,你可能会发现这个Q很有用:如何在变量中列名的情况下在data.table中完全通用地工作

最新更新