我希望能够使用一个包含表达式的字符串作为函数的参数,以便与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中完全通用地工作