R-parse()函数和eval()函数

目录

1-parse()函数

2-eval()函数

3-示例

3-1 将字符串对象转换为数值

3-2 使用eval()函数评估表达式的值

3-3 回归函数lm中


1-parse()函数

parse:解析

字符类对象转换为表达式类对象

用法: parse(text = character)

> x <- "sin(pi/2)"
> class(x)
[1] "character"



> x1 <- parse(text = x)
> class(x1)
[1] "expression"

2-eval()函数

eval: evaluate评估

待求值对象的类型可以是call类对象、表达式类对象或名称(在当前作用域中查找名称并求值其绑定)、promise或任何基本类型,如向量、函数和环境(返回时保持不变)。

表达式类对象转换为数值

用法:eval(expr) 其中expr表示要评估的对象

> x <- "2 ^ 3"
> eval(x)
[1] "2 ^ 3"
> x1 <- parse(text=x)
> eval(x1)
[1] 8

3-示例

3-1 将字符串对象转换为数值

#b是个字符串对象,使用双引号将内容括起来。
> b <- "
+ for (i in 1:5) {
+   print(i)
+ }
+ "

> class(b)
[1] "character"


#使用parse()函数将字符对象转换为表达式对象
> 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

3-2 使用eval()函数评估表达式的值

> 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 carb
Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1

3-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  

如果建模过程语句比较多,并且不同模型仅仅只是自变量发生了变化,那么编写函数可以简化过程。

然而,遇到的第一个问题是,编写函数时如何指明自变量?

通常人们很容易想到如下代码,但是下述代码编写方式行不通。

data(mtcars)

lm_func <- function(var) {
  lm(wt ~ var, data = mtcars)
}
lm_func(var = "mpg")
lm_fun(var = mpg)

# 正确方式是mtcars[,"mpg"]
lm_func(var = mtcars[,"mpg"])
lm(wt ~ mpg, data = mtcars)

使用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()函数的第一个参数为formula。因此,根据上述信息,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  

来源:R:parse函数和eval函数解析字符串为命令并运行_r语言eval(parse_zhihao-pku的博客-CSDN博客

猜你喜欢

转载自blog.csdn.net/u011375991/article/details/132595618