學科: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