R:parse函数和eval函数解析字符串为命令并运行
文章目錄
- 例子1
- 例子2
- 例子3:回歸函數lm中
- 例子4:繪圖函數ggplot中
parse函數解析字符串為表達式;eval函數執行表達式輸出結果;parse函數和eval函數在自定義函數中常常非常有用 library(ggplot2) rm(list = ls())
例子1
b為字符換:“character”
b <- " for (i in 1:5) {print(i) } " class(b) # [1] "character"parse函數將b轉化為表達式:“expression”
parsed_b <- parse(text = b) parsed_b # expression(for (i in 1:5) { # print(i) # })class(parsed_b) # [1] "expression"eval函數執行表達式
eval(parsed_b) # [1] 1 # [1] 2 # [1] 3 # [1] 4 # [1] 5例子2
mtcars為R自帶的有關汽車的數據集
class(mtcars) # [1] "data.frame"class(parse(text = "mtcars")) # [1] "expression"class(eval(parse(text = "mtcars"))) # [1] "data.frame"head(eval(parse(text = "mtcars"))) # mpg cyl disp hp drat wt qsec vs am gear # Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 # Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 # Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 # Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 # Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 # Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 # carb # Mazda RX4 4 # Mazda RX4 Wag 4 # Datsun 710 1 # Hornet 4 Drive 1 # Hornet Sportabout 2 # Valiant 1例子3:回歸函數lm中
使用mtcars數據集,以wt為因變量,欲分別建立mpg、cyl、disp、hp、drat與wt的回歸模型
以wt與mpg的回歸模型為例,可以直接這樣寫
lm(wt ~ mpg, data = mtcars) # # Call: # lm(formula = wt ~ mpg, data = mtcars) # # Coefficients: # (Intercept) mpg # 6.0473 -0.1409如果建模過程語句較多,而不同模型僅僅是自變量發生了變化,那么編寫函數可以簡化過程。
編寫函數時該如何指明自變量那?
以下函數編寫方式行不通,"mpg"或mpg無法正確識別
# lm_func <- function(var) { # lm(wt ~ var, data = mtcars) # } # # lm_func(var = mpg) # lm_func(var = "mpg")查閱幫助可知,lm函數的第一個參數為formula
# lm(formula = , data = )使用parse函數和eval函數將字符串形式的"wt ~ mpg"轉換為formula,再帶入lm函數后可以正確運行
class(eval(parse(text = "wt ~ mpg"))) # [1] "formula" lm(eval(parse(text = "wt ~ mpg")), data = mtcars) # # Call: # lm(formula = eval(parse(text = "wt ~ mpg")), data = mtcars) # # Coefficients: # (Intercept) mpg # 6.0473 -0.1409根據上述信息,lm_func函數可編寫為
lm_func <- function(var) {lm(eval(parse(text = paste0("wt ~ ", var))), data = mtcars) }lm_func(var = "mpg") # 正確執行了 # # Call: # lm(formula = eval(parse(text = paste0("wt ~ ", var))), data = mtcars) # # Coefficients: # (Intercept) mpg # 6.0473 -0.1409除了使用parse函數和eval函數,另一種方法是使用formula函數將字符串"wt ~ mpg"直接轉換為formula
class(formula("wt ~ mpg")) # [1] "formula" lm(formula("wt ~ mpg"), data = mtcars) # # Call: # lm(formula = formula("wt ~ mpg"), data = mtcars) # # Coefficients: # (Intercept) mpg # 6.0473 -0.1409使用formula函數,lm_func可編寫為
lm_func <- function(var) {lm(formula(paste0("wt ~ ", var)), data = mtcars) }lm_func(var = "mpg") # 正確執行了 # # Call: # lm(formula = formula(paste0("wt ~ ", var)), data = mtcars) # # Coefficients: # (Intercept) mpg # 6.0473 -0.1409例子4:繪圖函數ggplot中
使用mtcars數據集,以wt為因變量,欲分別繪制mpg、cyl、disp、hp、drat與wt的散點圖
以wt與mpg的散點圖為例,可以直接這樣寫
ggplot(data = mtcars, aes(x = mpg, y = wt)) +geom_point() +labs(x = "mpg", y = "wt") +theme_bw()這樣編寫繪圖函數,結果表明行不通
# plot_func <- function(var) { # ggplot(data = mtcars, aes(x = var, y = wt)) + # geom_point() + # labs(x = var, y = "wt") + # theme_bw() # } # # plot_func(var = mpg) # plot_func(var = "mpg")嘗試使用eval函數和parse函數,結果表明這樣可以正確運行
ggplot(data = mtcars, aes(x = eval(parse(text = "mpg")),y = eval(parse(text = "wt")))) + geom_point() + labs(x = "mpg", y = "wt") + theme_bw()根據上述信息,plot_func函數可編寫為
plot_func <- function(var) {ggplot(data = mtcars, aes(x = eval(parse(text = var)),y = eval(parse(text = "wt")))) + geom_point() + labs(x = var, y = "wt") + theme_bw() }plot_func(var = "mpg") # 正確運行了另一種方法:ggplot函數參數中,將aes改為aes_string可以正確處理字符串對象
ggplot(data = mtcars, aes_string(x = "mpg", y = "wt")) +geom_point() +labs(x = "mpg", y = "wt") + theme_bw()使用aes_string,繪圖函數還可編寫為
plot_func <- function(var) {ggplot(data = mtcars, aes_string(x = var, y = "wt")) + geom_point() + labs(x = var, y = "wt") + theme_bw() }plot_func(var = "mpg") # 正確運行了總結
以上是生活随笔為你收集整理的R:parse函数和eval函数解析字符串为命令并运行的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 维特比算法的java实现_维特比算法通俗
- 下一篇: 利用OpenMP加速拉伸图像操作