2017-03-02 83 views
2

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

,但它是没有用的,我想找到一种方法来提取的,可以通过“$”不只是指通过调用和查询内部函数的名称(S)书面代码为> open.account()
例如在open.account()情况下,我希望看到这样的事情:

$deposit 
$withdraw 
$balance 

3-有没有办法,我可以阅读更多关于它的内容?
tnx!

+3

请参阅帮助文件:'?“$”'。 – lmo

回答

12

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

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

可以使用names()

names(x) 
# [1] "a" "b" "c" 

这是一个基本的提取操作获得列表的名称。您可以通过在R中输入?Extract来查看相应的帮助页面。

-1

您通常需要选择整个列,即数据框中的一个特定变量。如果你想选择可变直径的所有元素,例如,这两个会做的伎俩: dataframe_name [,colomn_position] dataframe_name [“colomn_name”]

然而,有一个短切。如果您的列都有名称,你可以使用$符号:

dataframe_name $ colomn_name

2

有四种形式R中的提取操作的:[[[$@。第四种形式也称为槽操作符,用于从S4对象系统构建的对象中提取内容,也称为,在R中正式定义的对象。大多数开始的R用户不能使用正式定义的对象,所以我们不会在这里讨论slot操作符。

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

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

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

同样,可以使用[[[表单从对象中提取指定项目,例如anObject["namedItem"]anObject[["namedItem"]]。请参阅我的文章Forms of the Extract Operator

相关问题