R 在dplyr基礎上編寫函式 1 eval

2022-06-17 10:06:13 字數 1421 閱讀 8959

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,可以抽象記成 而電腦程式也是一樣,函式就是一種最基本的一種 抽象的方式。...