У меня возникли проблемы с доступом к переменным в j
при неэквивалентном слиянии.
library(data.table)
DT = data.table(x=rep(c("b","a","c"),each=3), y=c(1,3,6), v=1:9, date = seq(as.Date("2019-03-15"), by = "days", length.out = 9))
DTI <- data.table(date = as.Date(c("2019-03-16", "2019-03-21")), size = 55, len = c(3, 4), len2 = c(5, 5))
len_var <- "i.len"
DT[DTI, {
ct <- len;
mm <- len2
print(paste0("ct :", ct))
print(paste0 ("mm: ", mm))
i_min <- min(which(y > ct));
i_min
},
on = .(date > date),
by = .EACHI, allow.cartesian = TRUE, verbose = FALSE]
# [1] "ct :3"
# [1] "mm: 5"
# [1] "ct :4"
# [1] "mm: 5"
# date V1
# 1: 2019-03-16 1
# 2: 2019-03-21 2
# works
DT[DTI, {
ct <- get(len_var);
mm <- get("len2") # this variable causes issue in the following examples
print(paste0("ct :", ct))
print(paste0 ("mm: ", mm))
i_min <- min(which(y > ct));
i_min
},
on = .(date > date),
by = .EACHI, allow.cartesian = TRUE, verbose = FALSE]
# [1] "ct :3"
# [1] "mm: 5"
# [1] "ct :4"
# [1] "mm: 5"
# date V1
# 1: 2019-03-16 1
# 2: 2019-03-21 2
#error ???
DT[DTI, {
ct <- len;
mm <- get("len2")
print(paste0("ct :", ct))
print(paste0 ("mm: ", mm))
i_min <- min(which(y > ct));
i_min
},
on = .(date > date),
by = .EACHI, allow.cartesian = TRUE, verbose = FALSE]
# Error in validate(cols, x) :
# cols value [len] not present (or out of range) in x
Последнее выражение не работает. Почему? это сработает, если я изменю mm <- get("len2")
на mm <- len2
, но я хочу динамически передавать столбец для некоторых переменных. то есть это работает:
DT[DTI, {
ct <- len;
mm <- len2
print(paste0("ct :", ct))
print(paste0 ("mm: ", mm))
i_min <- min(which(y > ct));
i_min
},
on = .(date > date),
by = .EACHI, allow.cartesian = TRUE, verbose = FALSE]
1] "ct :3"
[1] "mm: 5"
[1] "ct :4"
[1] "mm: 5"
date V1
1: 2019-03-16 1
2: 2019-03-21 2
В чем дело? Я что-то пропустил? Это ожидаемое поведение в data.table? то есть доступ к переменным (столбцам) из i
таблицы данных в x[i, ]
слиянии должен выполняться таким же образом (жестко кодировать имена переменных или последовательно использовать get()
для доступа к каждой переменной).
Мы можем преобразовать его в символ (as.name
или as.symbol
), и он должен работать.
DT[DTI, {
ct <- len;
mm <- as.name("len2")
print(paste0("ct :", ct))
print(paste0 ("mm: ", mm))
i_min <- min(which(y > ct));
i_min
},
on = .(date > date),
by = .EACHI, allow.cartesian = TRUE, verbose = FALSE]
@ChilliProject Но проверьте свой вывод. Ваш оператор печати является одним из «мм», а не его значением.
+1 Хорошо. Можете ли вы объяснить, почему возникает ошибка, описанная выше? похоже на среду data.table, которую я не совсем понимаю
@ChilliProject Важно ли утверждение print
или фактическое присоединение?
@ChilliProject get
ищет объекты в окружающей среде. Возможно, вам придется указать правильный env, и это может привести к беспорядку.
в основном соединение. as.name или as.symbol более эффективны, чем использование get
?
@ChilliProject Я думаю, что оба должны быть почти одинаковыми. Но с get
лучше указывать envir
что печатает
mm: len2