Open MichaelChirico opened 5 years ago
to reduce number of NSE operations I would rather prefer to accept character vector to give.names
, otherwise new names will look ugly for a on-the-fly computed elements
to reduce number of NSE operations
We should have some internal utilities for this, then there's no duplication/bifurcation of logic at least
I think we could handle that in a more generic way. I recall some other places which could benefit from it as well. And one new coming in PR adding give.names to rolling functions.
The more generic way I have in mind is to pre-process j calls of form .(x, y)
into calls .(x=x, y=y)
. Then input we supply to shift (or any other fun) is a named list, rather unnamed, and give.names will handle that. So no change to shift is needed. NSE (to substitute names of variables) is moved to [ where is a good place for it already.
Proof of concept seems to work, but we also need to handle list()
not just .()
, and this will likely be a breaking change when user defined functions relied on V1, etc names.
DT[ , shift(.(latitude, longitude), c(-1L, 1L), give.names = TRUE)]
# latitude_lead_1 latitude_lag_1 longitude_lead_1 longitude_lag_1
# <num> <num> <num> <num>
# 1: -38.96353 NA -147.14499 NA
#...
diff
diff --git a/R/data.table.R b/R/data.table.R
index 473cf6e7..269a1555 100644
--- a/R/data.table.R
+++ b/R/data.table.R
@@ -94,7 +94,11 @@ replace_dot_alias = function(e) {
# . alias also used within bquote, #1912
if (e[[1L]] == 'bquote') return(e)
if (e[[1L]] == ".") e[[1L]] = quote(list)
- for (i in seq_along(e)[-1L]) if (!is.null(e[[i]])) e[[i]] = replace_dot_alias(e[[i]])
+ for (i in seq_along(e)[-1L]) if (!is.null(e[[i]])) {
+ if (is.name(e[[i]]) && is.null(names(e[i]))) {
+ names(e)[i] = as.character(e[[i]])
+ } else e[[i]] = replace_dot_alias(e[[i]])
+ }
}
e
}
I kind of expected
give.names
to apply the "usual" (indata.table
context at least) auto-names to the.(latitude, longitude)
input.