学科:R语言入门/问与答讨论园地

来自维基学院

问题:单引号还是双引号?有什么区别?[编辑 | 编辑源代码]

 > gl(2, 5, labels = c("female", "male") )
 > gl(2, 5, labels = c('female', 'male') )
  • 解答:在这里,gl函数中单引号和双引号没区别。
  • 通常两者是没有区别的,都是用来表示字符串。不过当字符串内容包含引号时就有区别了,单引号表示的字符串里可以包含双引号,反之亦然。如果同时有单引号和双引号,则需要用反斜杠做转义了。举例:
 > "A string contains single quote (')"
 [1] "A string contains single quote (')"
 > 'A string contains double quote (")'
 [1] "A string contains double quote (\")"
 > "A string contains both single quote (') and double quote (\")"
 [1] "A string contains both single quote (') and double quote (\")"
 > 'Another string contains both single quote (\') and double quote (")'
 [1] "Another string contains both single quote (') and double quote (\")"

问题:R packages包含datasets是什么意思?[编辑 | 编辑源代码]

  • 解答: 任何一个R包都可以包含函数、数据集等内容,所以很多R包里面都含有数据集,载入数据集的方法是
 library(R包名)
 data(数据集名)
 attach(数据集名)

问题:CRAN是什么?[编辑 | 编辑源代码]

  • 解答:CRAN是R的“综合档案馆”。

问题:x[x<-2]会有什么问题?[编辑 | 编辑源代码]

  • 解答: <-在牵涉到逻辑判断时,比如x[x<-2]会出现问题。
 set.seed(123) 
 x=rnorm(10) 
 x[x<-2] 
 x[x=2] 
 x[x<(-2)] 

问题:= 和<- 有区别吗?[编辑 | 编辑源代码]

  • Q1: =和<-有什么区别
  • A1: =是传值 <-是赋值符号.两者通常情况下是等价的.但部分情况不同. func(x=1)与func(x<-1)是有区别的,前者调用完后变量x不会被保留,而后者会在工作区里保留变量x=1。


  • Q2: 在学习中我发现R中经常出现这样的赋值,例如: dim(a)<-c(2,4) 这种赋值是否有特殊的名字?是否所有的函数都可以这样赋值?函数支持逆运算吗?
  • A2: 参见"Software for data analysis"第5章
    • 1)x[1:2] <- c(1,2)这种形式叫Replacement expression: "an assignment where the left side is not a name but an expression, identifying some aspect of the object we want to change."
    • 2) dim(x)<-c(1,2)叫replacement function,等价于"dim<-"。 参见http://stat.ethz.ch/R-manual/R-devel/library/base/html/dim.html
    • 3)另见http://cran.r-project.org/doc/manuals/R-lang.html#Subset-assignment


  • 其他观点:
    • 观点一:不认为两者有重要的区别
    • 观点二:在函数内部,只有“<-”才能实现赋值,“=”不能,其他地方好像两个是等价的。

备注:本节内容来自 http://cos.name/cn/topic/107719

问题:dim(m)<-c(2,5) 会改变 m 吗?[编辑 | 编辑源代码]

dim(m)<-c(2,5) 会改变m?真奇怪。在Java, Python等编程语言的标准函数中,这样做是不可想象的。

  • 解答:dim(m) 其实是获取了 m 的 dim 属性,而这里的赋值是修改了这个属性,而没有修改 m 本身(至少没有修改其数值内容)。它只是告诉 R,以后在处理 m 时,该把它当作什么来用。例如:
> m <- 1:10
> m  # 这里 m 中存了 10 个数字
 [1]  1  2  3  4  5  6  7  8  9 10
> dim(m)  # 一开始,它的 dim 属性是空的
NULL
> dim(m) <- c(2,5)
> m  # 修改 dim 属性后,m 里存放的仍然是数字1到10,但解析方法不同了,被当作matrix来用了。
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    3    5    7    9
[2,]    2    4    6    8   10
> attributes(m)  # 可以看到,m 多了一个 dim 的属性
$dim
[1] 2 5
> dim(m) <- c(5,2)  # 你可以再次改变这个属性,让它以另外一种方式来使用这10个数字
> m  # 其实在 m 里面存放的数字,连顺序都没有发生变化
     [,1] [,2]
[1,]    1    6
[2,]    2    7
[3,]    3    8
[4,]    4    9
[5,]    5   10
> dim(m) <- NULL  # 还可以把这个属性给清掉
> m  # 又回到初始的样子了
 [1]  1  2  3  4  5  6  7  8  9 10
> attributes(m)  # 属性没有了
NULL