R函数中美元符号"$"的含义是什么?

46

通过学习R,我刚刚发现了下面这段代码的解释在这里

open.account <- function(total) {
  list(
    deposit = function(amount) {
      if(amount <= 0)
        stop("Deposits must be positive!\n")
      total <<- total + amount
      cat(amount, "deposited.  Your balance is", total, "\n\n")
    },
    withdraw = function(amount) {
      if(amount > total)
        stop("You don't have that much money!\n")
      total <<- total - amount
      cat(amount, "withdrawn.  Your balance is", total, "\n\n")
    },
    balance = function() {
      cat("Your balance is", total, "\n\n")
    }
  )
}

ross <- open.account(100)
robert <- open.account(200)

ross$withdraw(30)
ross$balance()
robert$balance()

ross$deposit(50)
ross$balance()
ross$withdraw(500)

这段代码最让我感兴趣的是学习如何使用"$"美元符号,它指代了open.account()函数中的一个具体的内部函数。我的意思是这部分代码:

    ross$withdraw(30)
    ross$balance()
    robert$balance()

    ross$deposit(50)
    ross$balance()
    ross$withdraw(500)

问题:

1- 在 Rfunction() 中,美元符号 "$" 的含义是什么?
2- 如何在函数中识别其属性,特别是对于从其他地方采用的函数(即你没有编写该函数)?
我使用了以下脚本

> grep("$", open.account())
[1] 1 2 3

但这并不实用,我希望找到一种方法来提取可以通过"$"调用和引用的内部函数的名称,而不仅仅是通过调用和搜索代码如> open.account() 。例如,在open.account()的情况下,我想看到类似于以下内容:

$deposit
$withdraw
$balance

3- 有没有更多关于此的参考资料可供阅读?
谢谢!


6
请查看帮助文件:“?“$””。 - lmo
想要添加的是 $,它在部分匹配方面非常特殊。 - Arthur Yip
2个回答

62
$允许您从具有名称的列表中按名称提取元素。例如:
x <- list(a=1, b=2, c=3)
x$b
# [1] 2

您可以使用 names() 函数查找列表的名称。
names(x)
# [1] "a" "b" "c"

这是一个基本的抽取运算符。您可以在R中键入?Extract来查看相应的帮助页面。


1
那么这相当于在大多数其他编程语言中使用点号吗? - Earlee

41
在R语言中,提取运算符有四种形式:[[[$@。第四种形式也称为槽运算符,用于从使用S4对象系统构建的对象中提取内容,在R中也称为正式定义的对象。由于大多数初学者不会使用正式定义的对象,所以我们不会在这里讨论槽运算符。
第一种形式 [ 可用于从向量、列表或数据框中提取内容。
第二和第三种形式,[[$,从单个对象中提取内容。 $ 运算符使用名称执行提取,例如 anObject$aName。因此,它使得可以基于名称从列表中提取项目。由于 data.frame() 也是一个 list(),因此非常适合访问数据框中的列。即便如此,此形式无法使用计算索引或函数中的变量替换。
类似地,可以使用 [[[ 形式从对象中提取命名项,例如 anObject["namedItem"]anObject[["namedItem"]]
有关每种运算符形式的详细信息和示例,请阅读我的文章 Forms of the Extract Operator

在S3对象中访问名称

Daniel的帖子包括一个R对象open.account()的代码。按照规定,此对象基于S3对象系统,在该系统中,对象的行为被定义为list()中的项。
该代码创建了list()中的三个函数:depositwithdrawbalance。由于每个函数都分配了一个名称,因此可以使用 names() 函数列出 open.account() 中的函数。
> names(open.account())
[1] "deposit"  "withdraw" "balance" 
> 

我想补充一下,df$first_column 等同于 df[, 1, drop = TRUE] - jiggunjer
@jiggunjer 是的,但是 df[, 1] 就足够了。 - micsky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接