对于java程序员要理解的我来说,这条线非常困难。我认为'< - '是运营商,是一个分配运营商。但是我怎么能理解内部的子流程。 c(5,4)使向量具有两个值,然后该值如何传递给dim函数的输入?这个惯例对我来说不熟悉这一点。dim()函数的约定插入参数
dim(m) <- c(5,4) # Dimensions set to 5 & 4, so m is now a 5x4 matrix
对于java程序员要理解的我来说,这条线非常困难。我认为'< - '是运营商,是一个分配运营商。但是我怎么能理解内部的子流程。 c(5,4)使向量具有两个值,然后该值如何传递给dim函数的输入?这个惯例对我来说不熟悉这一点。dim()函数的约定插入参数
dim(m) <- c(5,4) # Dimensions set to 5 & 4, so m is now a 5x4 matrix
这通常被称为“语法糖”。
R的对象在理论上是不可变的。做这样的事情:
dim(m) = c(4,5)
看起来是改变m
,但在现实中的语法树被写入如:
m = D(m, c(4,5))
其中D
是从另一个矩阵构建矩阵和功能一套新的维度。之前的m
现在很可能是用于垃圾回收的,现在名称m
指向重新定义的矩阵。
这样的句法糖在R用于在物体似乎变异最多的地方,如a[1]=2
,这是在语法树表示为a = B(a,1,2)
,其中B
是创建从原来的a
但载体的构造函数第一个值设置为2。
注:这些分配功能,在上面的例子中D
和B
在R的实际命名dim<-
和[<-
,我呼吁清晰度D
和B
因为<-
函数名称看起来有点怪异,但R中完全可以接受的标识符
你是正确的<-
是赋值运算符(在几乎所有情况下,这是一样的=
运营商)。
当您运行
dim(m) <- c(5, 4)
你实际上是调用该函数
dim<-
此功能,甚至有一个帮助页面?dim<-
。所以
dim(m) <- c(5, 4)
是相当于
m <- `dim<-`(m, c(5, 2))
这是很常见的R:
# Vectors
x[1] = 10
## Data frames
df[1, 2] = 50
因此..您的意思是操作员不仅将值分配给左侧的值,还将参数分配给左侧的功能? – verystrongjoe
如果我理解你的评论,是的 – csgillespie
当你做dim(m) <- *
,你实际上调用不同功能设置尺寸为m
。该功能是dim<-
。它相当于以下内容:
m <- `dim<-`(m, c(5, 4))
所以会发生什么是一个新矩阵返回您指定的尺寸。 R解析器处理将原始语法转换为dim<-
的任务。
其他分配操作(例如names(*) <-
,class(*) <-
等)也会发生同样的情况。当您分配给子集时也会发生这种情况,如m[a, b] <-
:在这种情况下,该功能是[<-
。
虽然你所说的每一个'* < - '函数都是正确的,'[<-'函数的处理方式是不同的(至少在最近的R版本中),并且可能实际上改变了对象*引用*。尝试使用'require(data.table); a <-1:10;地址(a); a [7L] < - 11L;地址(a)',并且地址在替换之前和之后通常是相同的。 – nicola
@nicola在[< - 什么[是什么意思? – verystrongjoe
我试过这个实例。但我尝试了很多次。但都一样 – verystrongjoe