R function()中的美元符号“$”是什么意思?

What is the meaning of the dollar sign "$" in R function()?

通过学习R,我偶然发现了下面的代码解释here

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() 函数中的特定 internal function。我是说这部分:

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

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

问题:

1- R function() 中的美元符号 "$" 是什么意思?
2- 如何在函数中识别它的属性,特别是你从别人那里采用的函数(你没有写)?
我使用了以下脚本

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

但它没有用我想找到一种方法来提取可以由“$”引用的内部函数的名称,而不仅仅是通过调用和搜索编写的代码作为 > open.account()
例如,在 open.account() 的情况下,我希望看到这样的内容:

$deposit
$withdraw
$balance

3- 是否有任何参考资料可供我阅读更多相关信息?
谢谢!

$ 允许您按名称从命名列表中提取元素。例如

x <- list(a=1, b=2, c=3)
x$b
# [1] 2

您可以使用 names()

查找列表的名称
names(x)
# [1] "a" "b" "c"

这是一个基本的提取运算符。在R中输入?Extract即可查看对应的帮助页面。

R中提取运算符有四种形式:[[[$@。第四种形式也称为插槽运算符,用于从使用 S4 对象系统构建的对象中提取内容,也称为 R 中的正式定义对象。大多数 R 初学者不要使用正式定义的对象,所以我们不会在这里讨论槽运算符。

第一种形式,[,可用于从向量、列表或数据框中提取内容。

第二种和第三种形式,[[$,从单个对象中提取内容。

$ 运算符使用名称来执行提取,如 anObject$aName 中一样。因此,它使人们能够根据名称从列表中提取项目。由于 data.frame() 也是 list(),它特别适合访问数据框中的列。也就是说,这种形式不适用于计算索引或函数中的变量替换。

同样,可以使用[[[形式从对象中提取命名项,例如anObject["namedItem"]anObject[["namedItem"]]

有关使用运算符的每种形式的更多详细信息和示例,请阅读我的文章 Forms of the Extract Operator

访问 S3 对象中的名称

Daniel 的 post 包含 R 对象的代码,open.account()。正如指定的那样,此对象基于 S3 对象系统,其中对象的行为定义为 list() 中的项目。

代码在 list()depositwithdrawbalance 中创建了三个函数。由于每个函数都分配了一个名称,因此 open.account() 中的函数可以与 names() 函数一起列出,如下所示。

> names(open.account())
[1] "deposit"  "withdraw" "balance" 
>