可以使用
$
访问 data.frame 中的列,如下所示:
iris$Sepal.Length
# [1] 5.1 4.9 4.7 4.6 5.0 5.4 4.6 5.0 4.4 4.9 5.4 4.8 4.8 4.3 5.8 5.7 5.4 5.1
# [19] 5.7 5.1 5.4 5.1 4.6 5.1 4.8 5.0 5.0 5.2 5.2 4.7 4.8 5.4 5.2 5.5 4.9 5.0
data.frame 列也可以通过
$
使用反引号语法: 进行访问
`$`(iris, "Sepal.Length")
# [1] 5.1 4.9 4.7 4.6 5.0 5.4 4.6 5.0 4.4 4.9 5.4 4.8 4.8 4.3 5.8 5.7 5.4 5.1
# [19] 5.7 5.1 5.4 5.1 4.6 5.1 4.8 5.0 5.0 5.2 5.2 4.7 4.8 5.4 5.2 5.5 4.9 5.0
但是,如果提供变量或函数作为第二个参数,则结果会有所不同。例如,当通过变量提供第二个参数时:
var = "Sepal.Length"
`$`(iris, var)
# NULL
或通过函数:
`$`(iris, ifelse(TRUE, "Sepal.Length", NA))
# Error in `$`(iris, ifelse(TRUE, "Sepal.Length", NA)) :
# invalid subscript type 'language'
为什么当
$
的第二个参数由变量或函数(而不是字符串)提供时,其行为似乎有所不同?
如果您查看
$
(help($)
) 的帮助页面,您会发现以下内容:
$
x$名称
这告诉了如何使用
$
。当然你也可以使用它的函数形式($(x, name)
)
name
代表什么一个文字字符串或一个名称(可能用反引号引起来)。对于提取,这通常(参见“环境”下)与对象的名称部分匹配。
因此只允许使用 litteral string 和 name 对象。
[[
vs $
T
和[[
都选择列表中的单个元素。主要区别在于$
不允许计算索引,而$
允许。[[
相当于x$name
。此外,可以使用x[["name", exact = FALSE]]
参数控制[[
的部分匹配行为。exact
这强调了使用
$
时无法计算索引的事实,此外还表示允许部分匹配。