代码之家  ›  专栏  ›  技术社区  ›  kpierce8

使用attach()还是按名称或切片调用变量?

  •  26
  • kpierce8  · 技术社区  · 15 年前

    许多介绍书和指南都是从附上 data.frame 这样您就可以按名称调用变量。我总是发现使用 $ 符号或方括号切片 [,2] coding guidelines for R 其中包括线路

    1) 附加:避免使用它

    人们如何看待这种做法?

    7 回复  |  直到 8 年前
        1
  •  25
  •   Eduardo Leoni    15 年前

    我从不使用attach。 with within

    示例代码:

    > N <- 3
    > df <- data.frame(x1=rnorm(N),x2=runif(N))
    > df$y <- with(df,{
       x1+x2
     })
    > df
              x1         x2          y
    1 -0.8943125 0.24298534 -0.6513271
    2 -0.9384312 0.01460008 -0.9238312
    3 -0.7159518 0.34618060 -0.3697712
    > 
    > df <- within(df,{
       x1.sq <- x1^2
       x2.sq <- x2^2
       y <- x1.sq+x2.sq
       x1 <- x2 <- NULL
     })
    > df
              y        x2.sq     x1.sq
    1 0.8588367 0.0590418774 0.7997948
    2 0.8808663 0.0002131623 0.8806532
    3 0.6324280 0.1198410071 0.5125870
    

     > transform(df, xtot=x1.sq+x2.sq, y=NULL)
           x2.sq       x1.sq       xtot
    1 0.41557079 0.021393571 0.43696436
    2 0.57716487 0.266325959 0.84349083
    3 0.04935442 0.004226069 0.05358049
    
        2
  •  13
  •   Dirk is no longer here    15 年前

    我更喜欢使用 with 获得相当于 attach 在单个命令上:

     with(someDataFrame,  someFunction(...))
    

    这也自然导致了一种形式,其中 subset 第一个论点是:

     with(subset(someDataFrame,  someVar > someValue),
          someFunction(...))
    

    这就很清楚了,我们是根据一系列数据进行操作的。虽然许多建模功能同时具有这两种功能 data 子集 数据 子集 论据。

        3
  •  8
  •   Thierry    15 年前

    在教科书中经常使用attach的一个主要原因是它缩短了代码。

        4
  •  7
  •   Farrel    15 年前

    唯一有效的地方是在教室里 其中一个给定一个数据帧,并期望编写代码行对该数据帧进行分析。一旦分配完成并提交,用户不太可能再次使用该数据。

    然而 在现实世界中 ,则可以将更多数据帧添加到特定项目中的数据集合中。此外,人们经常复制和粘贴代码块以用于类似的事情。人们常常从几个月前做过的事情中借来,却记不起从何处来的细微差别。在这种情况下,一个人会被先前使用的“attach”淹死

        5
  •  3
  •   Waldir Leoncio TheNegative    10 年前

    正如莱昂尼所说, with within attach ,但我不会完全否定它。有时,当我直接在R提示符下工作时,我会使用它,并希望在将某些命令写入脚本之前测试它们。特别是在测试多个命令时, 可以是一个更有趣、更方便甚至无害的替代品 具有 在内部 ,自从你跑了以后 贴上 ,命令提示符清晰,您可以写入输入并查看输出。

    只要确保 detach 完成后,请查看您的数据!

        6
  •  3
  •   Rorschach    9 年前

    我宁愿不使用 attach() ,因为每次调用一批代码都要运行几次太容易了 . 每次都会将数据帧添加到搜索路径,从而不必要地扩展它。当然,良好的编程实践也需要 detach() 在代码块的末尾,但这常常被遗忘。

    相反,我使用xxx$y或xxx[,“y”]。它更透明。

    另一种可能性是使用许多函数中可用的数据参数,该参数允许在数据框中引用单个变量。例如。, lm(z ~ y, data=xxx) .

        7
  •  2
  •   Rorschach    9 年前

    attach() ,当您需要持久化一个对象(在本例中为 data.frame )在程序的整个生命周期中,当您使用多个函数时。我认为将对象保存在一个位置并根据需要调用其元素更方便,而不是将对象传递给使用它的每个R函数。

    也就是说,只有当我知道自己有多少可用内存,并且确保 detach() 数据帧 一旦超出范围。