#r #data.table
#r #data.table
Вопрос:
У меня возникли некоторые проблемы с доступом к переменным при 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()
последовательно для доступа к каждой переменной).
Ответ №1:
Мы можем преобразовать его в символ ( 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]
Комментарии:
1. это печатает
mm: len2
2. @ChilliProject Но проверьте свой вывод. Ваш оператор печати является одним из «мм», а не его значением
3. 1 Хорошо. можете ли вы объяснить, почему возникает ошибка, приведенная выше? похоже на что-то в среде data.table, что я не совсем понимаю
4. @ChilliProject
5. @ChilliProject
get
ищет объекты в среде. Возможно, вам потребуется указать правильный env, и это может привести к беспорядку