2016-09-19 29 views
2

对于java程序员要理解的我来说,这条线非常困难。我认为'< - '是运营商,是一个分配运营商。但是我怎么能理解内部的子流程。 c(5,4)使向量具有两个值,然后该值如何传递给dim函数的输入?这个惯例对我来说不熟悉这一点。dim()函数的约定插入参数

dim(m) <- c(5,4) # Dimensions set to 5 & 4, so m is now a 5x4 matrix 

回答

2

这通常被称为“语法糖”。

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。

注:这些分配功能,在上面的例子中DB在R的实际命名dim<-[<-,我呼吁清晰度DB因为<-函数名称看起来有点怪异,但R中完全可以接受的标识符

+0

虽然你所说的每一个'* < - '函数都是正确的,'[<-'函数的处理方式是不同的(至少在最近的R版本中),并且可能实际上改变了对象*引用*。尝试使用'require(data.table); a <-1:10;地址(a); a [7L] < - 11L;地址(a)',并且地址在替换之前和之后通常是相同的。 – nicola

+0

@nicola在[< - 什么[是什么意思? – verystrongjoe

+0

我试过这个实例。但我尝试了很多次。但都一样 – verystrongjoe

0

你是正确的<-是赋值运算符(在几乎所有情况下,这是一样的=运营商)。

当您运行

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 
+0

因此..您的意思是操作员不仅将值分配给左侧的值,还将参数分配给左侧的功能? – verystrongjoe

+0

如果我理解你的评论,是的 – csgillespie

1

当你做dim(m) <- *,你实际上调用不同功能设置尺寸为m。该功能是dim<-。它相当于以下内容:

m <- `dim<-`(m, c(5, 4)) 

所以会发生什么是一个新矩阵返回您指定的尺寸。 R解析器处理将原始语法转换为dim<-的任务。

其他分配操作(例如names(*) <-,class(*) <-等)也会发生同样的情况。当您分配给子集时也会发生这种情况,如m[a, b] <-:在这种情况下,该功能是[<-