为什么 $ 运算符在前缀表示法中使用时不接受变量或求值参数作为其第二个参数?

问题描述 投票:0回答:1

可以使用

$
访问 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'

问题

为什么当

$
的第二个参数由变量或函数(而不是字符串)提供时,其行为似乎有所不同?

r dataframe infix-notation non-standard-evaluation infix-operator
1个回答
0
投票

如果您查看

$
(
help($)
) 的帮助页面,您会发现以下内容:

1 如何使用
$

x$名称

这告诉了如何使用

$
。当然你也可以使用它的函数形式(
$(x, name)
)

2
name
代表什么

一个文字字符串或一个名称(可能用反引号引起来)。对于提取,这通常(参见“环境”下)与对象的名称部分匹配。

因此只允许使用 litteral stringname 对象。

3
[[
vs
$

T

[[
$
都选择列表中的单个元素。主要区别在于
$
不允许计算索引,而
[[
允许。
x$name
相当于
x[["name", exact = FALSE]]
。此外,可以使用
[[
参数控制
exact
的部分匹配行为。

这强调了使用

$
时无法计算索引的事实,此外还表示允许部分匹配。

© www.soinside.com 2019 - 2024. All rights reserved.