我确信这个问题有一个非常基本的答案,这可能就是为什么我发现很难真正搜索和找到答案的原因。但是有人能解释一下在R中以相同的语法组合$和((到底意味着什么吗?
例如这个小插曲:
https://cran.r-project.org/web/packages/pivottabler/vignettes/v00-vignettes.html
library(pivottabler)
pt <- PivotTable$new()
pt$addData(bhmtrains)
pt$renderPivot()
直到几年后的今天,我在学习R时从未遇到过这种情况。我最近看到的越来越多,但这对我来说不是直观的吗?
$通常用于访问数据帧的R类列中对象的子结构,例如dataframe$column1
,而((通常用于包含命名函数的所有参数,例如rnorm(10,0,1)
当它们一起使用时意味着什么?例如x$y(z)
列表是一个由有序的对象集合(包括其他列表(组成的对象,可能是不同类型的,所述组件。
考虑以下列表:
L <- list(a = 1, f = function() message("hello"))
这是一个包含两个组件的列表:a
和f
。第一个是数字,第二个是函数。通过应用$
-运算符,可以提取组件的值,该值也可以重新分配:
L$a
# 1
L$a <- 2
L$a
# 2
在f
组件的情况下,因为它是一个函数,所以可以得到它的主体:
L$f
# function() message("hello")
这与每个函数标识符一致:它的值是函数的主体。毫不奇怪,将括号应用于函数的标识符,即可执行函数,即:
L$f()
# hello
这为非常强大的结构打开了大门,在那里您可以存储数据和操作它们的函数。
这种逻辑类似于OOP世界中使用的类。当然,您需要更多的特性,比如实例化、继承。例如,您在标签中提到的R6包提供了这样的机制。
library(R6)
A <- R6Class("A", list(f=function() message("hello") ))
a <- A$new()
a$f()
# hello
A
是R6类,因此A$new()
通过类函数new
创建该类的新实例a
。正如您所看到的,使用类似于上面L$f()
的语法(和逻辑(来调用此函数。实例a
继承了类函数f
,这里说方法,a$f()
执行它