在 j data.table 中使用函数代替 {}
Use function instead of {} in j data.table
你能帮我理解为什么在 data.table 中我可以在 {} 中按名称访问列,例如
dt <- data.table(x=1:2, y=1:2)
dt[,{
list(z = x + y)
}]
但不能在函数中做同样的事情
test_sum <- function() {
list(z = x + y)
}
dt[, test_sum()]
这与 中的相同吗?
如果是这样,是不是最好有像
这样的功能
test_sum2 <- function(data) {
list(z = data$x + data$y)
}
dt[, test_sum2(.SD)]
或
test_sum3 <- function(x, y) {
list(z = x + y)
}
dt[, test_sum3(x, y)]
我不太确定您为什么要这样做,尤其是在阅读了链接的问题之后。理论上你可以这样做:
test_sum <- function() quote(list(z = x + y))
dt[, eval(test_sum)]
但是正如链接的答案所说,一旦您开始使用 by
,您可能 运行 会遇到问题。
列确实应该在您的 data.table 调用中定义,因此更好的方法是:
test_sum <- function(a, b) a + b
dt[, list(z = test_sum(x, y))]
或上面的 test_sum3
。
我认为您将大括号混淆为代表匿名函数。它们代表一个表达式,将在当前范围内执行。有关 eval 和 quote 以及其他类似内容的更多信息,请参阅 Hadley Wickham's excellent chapter on non-standard evaluation。
我认为你最后的选择是最好的。你的第一个选择 - 没有任何参数只是不好的做法,因为 reader 不清楚函数 internally/magically 使用外部数据(假设你让它工作)。第二种选择更好,但你传递了太多信息。您的最后一个选项传递了准确数量的信息,这与 data.table 配合得很好,因为它不必在计算中提供其他列。
至于 为什么 选项一不起作用,这仅仅是因为 data.table 只提供它检测到的 j-expression
环境中的那些列使用(通过对表达式进行简单的文本分析,在本例中为 test()
,不使用任何列)。
你能帮我理解为什么在 data.table 中我可以在 {} 中按名称访问列,例如
dt <- data.table(x=1:2, y=1:2)
dt[,{
list(z = x + y)
}]
但不能在函数中做同样的事情
test_sum <- function() {
list(z = x + y)
}
dt[, test_sum()]
这与 中的相同吗?
如果是这样,是不是最好有像
这样的功能test_sum2 <- function(data) {
list(z = data$x + data$y)
}
dt[, test_sum2(.SD)]
或
test_sum3 <- function(x, y) {
list(z = x + y)
}
dt[, test_sum3(x, y)]
我不太确定您为什么要这样做,尤其是在阅读了链接的问题之后。理论上你可以这样做:
test_sum <- function() quote(list(z = x + y))
dt[, eval(test_sum)]
但是正如链接的答案所说,一旦您开始使用 by
,您可能 运行 会遇到问题。
列确实应该在您的 data.table 调用中定义,因此更好的方法是:
test_sum <- function(a, b) a + b
dt[, list(z = test_sum(x, y))]
或上面的 test_sum3
。
我认为您将大括号混淆为代表匿名函数。它们代表一个表达式,将在当前范围内执行。有关 eval 和 quote 以及其他类似内容的更多信息,请参阅 Hadley Wickham's excellent chapter on non-standard evaluation。
我认为你最后的选择是最好的。你的第一个选择 - 没有任何参数只是不好的做法,因为 reader 不清楚函数 internally/magically 使用外部数据(假设你让它工作)。第二种选择更好,但你传递了太多信息。您的最后一个选项传递了准确数量的信息,这与 data.table 配合得很好,因为它不必在计算中提供其他列。
至于 为什么 选项一不起作用,这仅仅是因为 data.table 只提供它检测到的 j-expression
环境中的那些列使用(通过对表达式进行简单的文本分析,在本例中为 test()
,不使用任何列)。