【问题标题】:Why is it not advisable to use attach() in R, and what should I use instead?为什么不建议在 R 中使用 attach(),我应该改用什么?
【发布时间】:2012-04-21 11:59:36
【问题描述】:

假设我们有一个数据框x,其中包含jobincome 列。引用框架中的数据通常需要命令x$job 用于job 列中的数据和x$income 用于income 列中的数据。

但是,使用命令attach(x) 允许在引用相同数据时取消数据框的名称和$ 符号。因此,x$job 在 R 代码中变为 jobx$income 变为 income

问题是许多 R 专家建议不要在 R 中编码时使用 attach() 命令。

造成这种情况的主要原因是什么?应该改用什么?

【问题讨论】:

    标签: r dataframe r-faq


    【解决方案1】:

    何时使用:

    我使用attach(),当我想要您在大多数统计数据包(例如Stata、SPSS)中获得的一次处理一个矩形数据集的环境时。

    何时不使用:

    然而,当你有几个不同的数据集时,它会变得非常混乱,代码很快变得不可读,特别是如果你实际上使用 R 作为一个粗略的关系数据库,其中不同的矩形数据,都与手头的问题相关,也许用于匹配来自不同矩形的数据的各种方式,具有相同名称的变量。

    with() 函数或许多函数的 data= 参数是许多 attach() 很诱人的实例的绝佳替代品。

    【讨论】:

    • +1 建议with。如果您希望保存比 attach 更好的打字/错字。
    【解决方案2】:

    我认为使用attach 没有任何问题。我自己不使用它(再说一次,我喜欢动物,但也不要养动物)。当我想到attach 时,我认为是长期的。当然,当我使用脚本时,我对它了如指掌。但是在一周、一个月或一年的时间里,当我回到脚本时,我发现搜索某个变量来自哪里的开销,太贵了。许多方法都有data 参数,这使得调用变量非常容易(sensulm(x ~ y + z, data = mydata))。如果没有,我对with 的使用感到满意。

    简而言之,在我的书中,attach 非常适合简短的快速数据探索,但对于开发我或其他人可能想要使用的脚本,我会尽量让我的代码保持可读性(和可转移性)。

    【讨论】:

    • +1 指出data= 可以使用具有它的各种命令完成相同的任务。
    【解决方案3】:

    不使用attach 的另一个原因:它允许访问数据框列的值,仅用于读取(访问),并且与附加时一样。它不是该列当前值的简写。两个例子:

    > head(cars)
      speed dist
    1     4    2
    2     4   10
    3     7    4
    4     7   22
    5     8   16
    6     9   10
    > attach(cars)
    > # convert stopping distance to meters
    > dist <- 0.3048 * dist
    > # convert speed to meters per second
    > speed <- 0.44707 * speed
    > # compute a meaningless time
    > time <- dist / speed
    > # check our work
    > head(cars)
      speed dist
    1     4    2
    2     4   10
    3     7    4
    4     7   22
    5     8   16
    6     9   10
    

    即使 distspeed 已分配给 cars 数据集,也没有进行任何更改。

    如果明确分配回数据集...

    > head(cars)
      speed dist
    1     4    2
    2     4   10
    3     7    4
    4     7   22
    5     8   16
    6     9   10
    > attach(cars)
    > # convert stopping distance to meters
    > cars$dist <- 0.3048 * dist
    > # convert speed to meters per second
    > cars$speed <- 0.44707 * speed
    > # compute a meaningless time
    > cars$time <- dist / speed
    > # compute meaningless time being explicit about using values in cars
    > cars$time2 <- cars$dist / cars$speed
    > # check our work
    > head(cars)
        speed   dist      time     time2
    1 1.78828 0.6096 0.5000000 0.3408862
    2 1.78828 3.0480 2.5000000 1.7044311
    3 3.12949 1.2192 0.5714286 0.3895842
    4 3.12949 6.7056 3.1428571 2.1427133
    5 3.57656 4.8768 2.0000000 1.3635449
    6 4.02363 3.0480 1.1111111 0.7575249
    

    在计算time 时引用的distspeed 是原始(未转换)值;附加carscars$distcars$speed 的值。

    【讨论】:

    • 我不喜欢的是你仍然需要使用等式左侧的“cars$”。
    【解决方案4】:

    如果您多次执行attach(data),例如5 次,那么您可以看到(在search() 的帮助下)您的数据已在工作空间环境中附加了5 次。因此,如果您取消附加 (detach(data)) 一次,data 仍然会在环境中出现 4 次。因此,with()/within() 是更好的选择。它们有助于创建包含该对象的本地环境,您可以使用它而不会造成任何混淆。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-01
      • 1970-01-01
      • 2010-12-22
      • 2010-10-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多