tidyverse系列的r包雖然解放了大家的雙手,但同時也束縛了我們重新編寫函式的能力。在這一套語法中,要實現作為函式引數的字串和變數之間的相互轉換困難重重,但只要掌握了其中原理後,也就能夠游刃有餘地處理了。
首先要理解基礎r中幾個重要又易忽略的函式。
eval
evaluate an (unevaluated) expression:
evaluate an r expression in a specified environment.
簡言之就是:對表示式物件的求值。
可以把字串轉化成表示式來執行, 通常eval和parse結合使用,引數 text 等於要轉化的字串。
表示式物件不能如下表示:
eval("5+5")
[1] "5+5" #得到的是乙個字串
需要結合parse函式結合text引數來將字串轉化成乙個表示式,再進行求值:
> eval(parse(text="5+5"))
[1] 10
> class("5+5")
[1] "character"
> class(parse(text="5+5"))
[1] "expression"
不僅僅求值,eval能呼叫很多行為,如函式。
> class(eval(parse(text="5+5")))
[1] "numeric"
> class(eval(parse(text="gray"))) #?gray是乙個函式
[1] "function"
> class(eval(parse(text="blue")))
error in eval(expr, envir, enclos) : object 'blue' not found
當然,現在也有一些方法能一步到位。如lazyeval包的lazy_eval函式:
> lazyeval::lazy_eval("5+5")
[1] 10
或用rlang
:
library(rlang)
eval(parse_expr("5+5"))
[1] 10
但我們要清晰地認識到,字串和表示式兩者之間其實是沒有任何關係的,這裡只是通過parse(text=)連線起來,而parse(text=)的這種方法並不安全,容易出錯,應該慎用。我們更多的應該用substitute()
和quote()
函式,接下來我們介紹這兩個函式。
ref:
R函式編寫基礎
編寫函式 第一部分 1 print str 列印函式,列印出字元內容 2 sprintf hello,s yjz s是佔位符,3 函式引數以及函式呼叫 hello.persion function first,last 4 預設引數 hello.persion function first,last...
R高階(1) dplyr中的Select函式
大神hadley wickham的dplyr包更新到了1.0.0版 今天 一下裡面的神函式select.首先檢查你是否安裝了最新版本的dplyr版本 packageversion dplyr 1 0.8.3 趕緊更新 install.packages dplyr 搞定,1.0.0版 select函式...
Python自學 08 函式基礎(上)
就像中學所學的一樣,也可以稱之為 方法 可以用來解決各種數學計算或者實現切合實際的功能,例如計算圓的面積 s pi r r,只要知道半徑,什麼圓的面積都可以計算出來。這就是一種抽象,再舉個栗子 計算數列的和 1 2 3 100,可以抽象記成 而電腦程式也是一樣,函式就是一種最基本的一種 抽象的方式。...