你被R語言的 和 搞昏了頭嗎

2021-09-06 21:35:33 字數 4063 閱讀 2078

學習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兩門語言的選擇。一般來說,資料分析中對於這兩門語言都是比較重視的,如果學會了這兩門語言那麼就能夠做好資料分析工作,從而成為高階資料分析師。但是畢竟人的精力是有限的,短時間內不可能都掌握好這兩門語言,所以我們通過給大家介紹一下這兩門語言給大家乙...