Неверный первый аргумент в get при использовании data.table в lapply - PullRequest
2 голосов
/ 03 октября 2019

Вот data.table и функция minmax, возвращающая список:

library(data.table)
DT = data.table(
  x = c(1.59631745098427, -1.82698333087074, -1.69796526239799, 
        -0.69409651665197, 0.360640961221989), 
  y = c(-2.11104985109763, -1.49347081392737, 1.49801321753262,
        -0.736044012256148, 1.68957962245701), 
  Factor1 = c("a", NA, "a", "a", "a"), 
  Factor2 = c("UU", "UU", "UU", "UU", "UU"), 
  Factor3 = c("GHI", "GHI", "DEF", "ABC", "DEF"), 
  x_FACTOR = c("(1,2]", "(-2,-1]", "(-2,-1]", "(-1,0]", "(0,1]"),
  y_FACTOR = c("(-3,-2]", "(-2,-1]", "(1,2]", "(-1,0]", "(1,2]"), 
  Factor1_FACTOR = c("a", NA, "a", "a", "a"),
  Factor2_FACTOR = c("UU", "UU", "UU", "UU", "UU"), 
  Factor3_FACTOR = c("GHI", "GHI", "DEF", "ABC", "DEF")
)

minmax <- function(x) list(min = min(x), max = max(x))

names(DT)
# [1] "x"              "y"              "Factor1"        "Factor2"        "Factor3"       
# [6] "x_FACTOR"       "y_FACTOR"       "Factor1_FACTOR" "Factor2_FACTOR" "Factor3_FACTOR"

Я могу сделать:

DT[, minmax(get("x"))]
#          min      max
# 1: -1.826983 1.596317

Но в lapply я получаю ошибку:

lapply(c("x", "y"), function(x) DT[, minmax(get(x))])
#  Error in get(x) : invalid first argument

Очень странно то, что это происходит из приложения Shiny, куда загружается набор данных, и для других наборов данных я не получаю эту ошибку.


РЕДАКТИРОВАТЬ

Я только что заметил, что это работает так:

lapply(c("x", "y"), function(u) DT[, minmax(get(u))])

Любые объяснения приветствуются.

1 Ответ

1 голос
/ 03 октября 2019

Проблема в том, что существует столбец с именем x, поэтому область видимости означает x, что столбец найден до x аргумента из lapply. Вы можете наблюдать это так:

lapply(c("x", "y"), function(x) DT[, minmax({dput(x); get(x)})])
# c(1.59631745098427, -1.82698333087074, -1.69796526239799, -0.69409651665197, 0.360640961221989)
...