R 提取运算符:[ vs $

rjs*_*jss 1 r

有多个帖子在网上就有关的异同[$。我看到一些帖子$只推荐用于交互使用,而不推荐用于编程。但是,我不确定我是否理解这是一种偏好还是这种想法背后有解释。

现在假设我正在编写一个包或函数,如果我按名称(例如,mtcars[["mpg"]])提取元素,为什么我应该避免使用mtcars$mpg

Gre*_*gor 5

[[和之间有两个真正重要的区别$

  1. [[- 处理字符串(即它支持变量替换),$不。如果有my_var = "mpg",则可以使用mtcars[[my_var]],但没有使用my_varwith的好方法$

  2. $自动完成,如果部分列名是明确的。mtcars$m将返回mpg列,mtcars[["m"]]将返回NULL. mtcars$d将返回,NULL因为多列以“d”开头。

#1 使[[编程更加灵活 - 在编程使用中使用存储为字符串的列名是非常常见的。

#2$更危险——你不应该在编程中使用缩写的列名,但是在交互式使用中它可以很好而且快速。(尽管这在很大程度上与 RStudio 的自动完成功能无关,如果您使用该 IDE。)