【问题标题】:Invalid first argument in get when using data.table in lapply在 lapply 中使用 data.table 时,get 中的第一个参数无效
【发布时间】:2020-02-01 15:10:53
【问题描述】:

这是一个 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))])

欢迎任何解释。

【问题讨论】:

  • 这一定和列名有关。我尝试将列 x 重命名为 z 并且效果很好(就像您第二次尝试在函数中使用 u 一样)。所以我猜x 定义之间存在冲突,它认为您指的是该列。
  • 一个简短的说明,我会将minmax 替换为as.list(range(x)),因为range 计算minmax 一次通过(minmax 需要两次通过)

标签: r data.table lapply


【解决方案1】:

问题在于有一个名为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)

【讨论】:

  • 这不是.. 的用途吗? lapply(c("x", "y"), function(x) DT[, minmax(get(..x))]) 工作。
  • 不应该需要get 那里有@Frank2? DT[ , minmax(..x)]?
  • 我认为 ..x 在不需要 get 的情况下工作会很好,但现在这不是 .. 查找所做的,对吧?更改它以使.. 对列有用(而不是其他DT[] 变量之外的变量)可能过于严格......是的,新帐户,因为我总是登录我的主通过 Google 开设帐户,并且在最近换工作后不想在工作中这样做。
猜你喜欢
  • 1970-01-01
  • 2018-11-25
  • 2013-07-22
  • 2020-03-12
  • 1970-01-01
  • 1970-01-01
  • 2015-11-23
  • 2017-11-17
  • 1970-01-01
相关资源
最近更新 更多