學習r有一周了,心中一直有乙個困惑,關於= 和 <-,今晚決定搞定它!
迄今為止用到最多的函式是matrix() 和c(),就用他們說起!
之前學了四五門語言,對於=賦值已經成了慣性,下面是我的習慣寫法:
matrix(1:6,nrow = 2,ncol = 3,byrow = false) #有時候寫成 byrow = f ,但發現錯了,縮寫的false導致這個引數設定無效。
可實際上還有另外一種用<-的才是書中常用的寫法:
matrix(1:6,nrow <- 2,ncol <- 3,byrow <- false)
rstudio裡面f1得到幫助文件是這樣的:
matrix(data = na, nrow = 1, ncol = 1, byrow = false, dimnames = null)
因此本文的目標在於總結這兩種用法的區別和注意的地方。
上**:
# 函式要求引數型別-----更特殊的情況,
#函式定義:system.time(expr, gcfirst = true)
system.time(x = 100) #問題一:執行失敗,為什麼?
## error: 引數((x = 100)) 沒有用
system.time(x <- 100) #執行成功
## user system elapsed
## 0 0 0
解答1:
1. <-箭頭是表示式,而=等號僅為賦值語句而非表示式。
2. 作為函式引數使用時,使用<-箭頭表示式的話,會自動在使用者空間棧建立相應的變數,而=等號則沒有此項動作。
3.<-箭頭用作為函式設定引數使用時,由於其表示式(exp)的特性,實際上是有兩步動作,
1.執行表示式
2.將結果當做匿名引數傳遞給函式。注意是匿名引數,接下來的例子還要講到。
matrix(1:6, 3, true)
#問題2:本意是,給出3,他應該知道自己除以下得到列數,結果卻與預期不符, 少了1列,為什麼
## [,1]
## [1,] 1
## [2,] 2
## [3,] 3
matrix(1:6, 3, 2, true)
## [,1] [,2]
## [1,] 1 2
## [2,] 3 4
## [3,] 5 6
解答2:
1.直譯器按照matrix函式定義的順序index,對引數進行解釋分析。
2.直譯器對於 匿名引數會自動將true 轉換成 1, 將false轉換成 0
# 不照函式定義的引數順序來設定 nrow 和 ncol 屬性。
matrix(1:6, byrow = false, 3)
#問題3:引數不按定義也行的通,為什麼?
## [,1] [,2]
## [1,] 1 4
## [2,] 2 5
## [3,] 3 6
matrix(1:6, byrow <- false, 2) #錯誤,參見問題2
matrix(1:6, byrow = false, 2) #不按照引數順序,給出nrow = 2,自動得到3列
## [,1] [,2] [,3]
## [1,] 1 3 5
## [2,] 2 4 6
matrix(1:6, byrow <- true, 2) #只得到一行,原因見 問題2.
解答3:
1.當使用=時,命名引數提前,但是直譯器將會忽略其index,因此,解釋依然正確。
2.當使用<-時,相當於是匿名引數。
#使用<-,並打亂引數的位置,無名引數將會自動排除之前的命名引數
matrix(1:6, ncol <- 2, nrow <- 3, byrow = true)
#問題4:設定col為2,結果卻為3,為什麼?
## [,1] [,2] [,3]
## [1,] 1 2 3
## [2,] 4 5 6
matrix(1:6, ncol <- 3, nrow <- 2, byrow = true) #設定col為3,結果輸出卻為2,為什麼?
## [,1] [,2]
## [1,] 1 2
## [2,] 3 4
## [3,] 5 6
解答4:
使用<- 相當於是匿名引數,不過在當前使用者空間多了乙個新的變數而已。
# 這還不夠,下面繼續!
matrix(1:6, ncol = 2, nrow = 3, byrow = true)
#問題5:引數逆序也可以,結果與預期一致,3是3,2歸2,沒錯。,但為什麼?
## [,1] [,2]
## [1,] 1 2
## [2,] 3 4
## [3,] 5 6
matrix(1:6, ncol = 3, nrow = 2, byrow = true) #與預期一致。
## [,1] [,2] [,3]
## [1,] 1 2 3
## [2,] 4 5 6
解答5: 命名引數可以不按照函式引數順序排列,隨意。
# 問題6:下面**的區別是什麼?(<-的孤立點問題)
# code seg 1
x = 1
fun = function(x) return(true)
fun(x = x + 1);x
## [1] true
## [1] 1 #x的值未改變
fun(x <- x + 2);x
## [1] true
## [1] 1
# code seg 2
x = 1
fun = function(x)
fun(x = x + 1);x
## [1] true
## [1] 1 #依然未改變
fun(x <- x + 2);x
## [1] true
## [1] 3 #變成3
解答6:
這是r **的地方,也是它主動優化的結果,當函式定義被直譯器分析時,若發現引數未被函式體內任何**引用,則此參量不會被真正地傳遞執行。即使其使用<-箭頭表示式。
#再總結:
<- 和 = 的區別在於當引數使用時,引數存在匿名引數、命名引數兩大類。
1.當使用=時,命名引數提前,但是直譯器將會忽略其index,因此,解釋依然正確。
2.當使用<-時,相當於是匿名引數。不過在當前使用者空間多了乙個新的變數而已。
3. <-箭頭是表示式,而=等號僅為賦值語句而非表示式。
4. 作為函式引數使用時,使用<-箭頭表示式的話,會自動在使用者空間棧建立相應的變數,而=等號則沒有此項動作。
5.<-箭頭用作為函式設定引數使用時,由於其表示式(exp)的特性,實際上是有兩步動作,
1.執行表示式
2.將表示式的結果當做匿名引數傳遞給函式。
6.當傳遞的引數都為匿名引數時,直譯器按照matrix函式定義的順序index,對引數進行解釋分析,並不會對變數型別進行檢測後對號入座,
如果可以,它倒是會自動轉換型別以適應目標位置的型別。如:使用false 和 true時,碰到型別不匹配的地方,直譯器會自動將true 轉換成 1, 將false轉換成 0
7:命名引數可以不按照函式引數順序排列,可隨意。
8:這是r **的地方,也是它主動優化的結果,當函式定義被直譯器分析時,若發現引數未被函式體內任何**引用,則此參量不會被真正地傳遞執行。即使其使用<-箭頭表示式。
reference:
1.2.
3. ... 824&page=2#pid87934
4.
R語言中recharts包的安裝和使用
在rstudio上進行安裝的,r版本是3.6.0 library devtools install github madlogos recharts 安裝不上,有個什麼rcul的包直接刪除後,重新執行以上命令就可以安裝成功。具體的是什麼原因,可以看報錯的內容。一般情況是 1 remove 2 ins...
R語言中函式lines和abline的區別
函式lines 其作用是在已有圖上加線,命令為lines x,y 其功能相當於plot x,y,type 1 函式abline 可以在圖上加直線,其使用方法有四種格式。1 abline a,b 表示畫一條y a bx的直線 2 abline h i 表示畫出一條y i的水平直線 3 abline v...
Python和R語言之間的抉擇(二)
在前面的文章中我們給大家簡單介紹了一下對於python與r兩門語言的選擇。一般來說,資料分析中對於這兩門語言都是比較重視的,如果學會了這兩門語言那麼就能夠做好資料分析工作,從而成為高階資料分析師。但是畢竟人的精力是有限的,短時間內不可能都掌握好這兩門語言,所以我們通過給大家介紹一下這兩門語言給大家乙...