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

时间:2017-03-02 15:57:21

标签: r function scope lexical-scope

通过学习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)

我对此代码最感兴趣的是,学习使用"$"美元符号来引用internal function函数中的特定open.account()。我的意思是这一部分:

    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

但它没有用我想找到一种方法来提取可以通过&#34; $&#34;引用的内部函数的名称。而不只是通过调用和搜索编写的代码> open.account()
  例如,在open.account()的情况下,我希望看到类似的内容:

$deposit
$withdraw
$balance

3-有没有可以参考的参考资料?
TNX!

3 个答案:

答案 0 :(得分:27)

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

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

您可以使用names()

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

这是一个基本的提取算子。您可以在R。

中键入?Extract来查看相应的帮助页面

答案 1 :(得分:12)

R中有四种形式的提取运算符:[[[$@。第四种形式也称为插槽操作符,用于从使用S4对象系统构建的对象中提取内容,也称为R中的正式定义的对象。大多数R用户都是&#39 ; t使用正式定义的对象,因此我们不会在这里讨论插槽运算符。

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

第二个和第三个表单[[$从单个对象中提取内容。

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

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

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

答案 2 :(得分:1)

您经常需要选择整个列,即数据框中的一个特定变量。例如,如果要选择可变直径的所有元素,这两个元素都可以实现: 的 dataframe_name [,colomn_position]   dataframe_name [&#34; colomn_name&#34;]

然而,有一个捷径。如果您的列有名称,则可以使用$ sign:

<强> dataframe_name $ colomn_name