有多个帖子在网上就有关的异同[和$。我看到一些帖子$只推荐用于交互使用,而不推荐用于编程。但是,我不确定我是否理解这是一种偏好还是这种想法背后有解释。
现在假设我正在编写一个包或函数,如果我按名称(例如,mtcars[["mpg"]])提取元素,为什么我应该避免使用mtcars$mpg?
[[和之间有两个真正重要的区别$:
[[- 处理字符串(即它支持变量替换),$不。如果有my_var = "mpg",则可以使用mtcars[[my_var]],但没有使用my_varwith的好方法$。
$自动完成,如果部分列名是明确的。mtcars$m将返回mpg列,mtcars[["m"]]将返回NULL. mtcars$d将返回,NULL因为多列以“d”开头。
#1 使[[编程更加灵活 - 在编程使用中使用存储为字符串的列名是非常常见的。
#2$更危险——你不应该在编程中使用缩写的列名,但是在交互式使用中它可以很好而且快速。(尽管这在很大程度上与 RStudio 的自动完成功能无关,如果您使用该 IDE。)