Неожиданное поведение при попытке доступа к нескольким столбцам

#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 print Важно утверждение или фактическое объединение?

5. @ChilliProject get ищет объекты в среде. Возможно, вам потребуется указать правильный env, и это может привести к беспорядку