目录
1-parse()函数
2-eval()函数
3-示例
3-1 将字符串对象转换为数值
3-2 使用eval()函数评估表达式的值
3-3 回归函数lm中
parse:解析
将字符类对象转换为表达式类对象。
用法: parse(text = character)
> x <- "sin(pi/2)"
> class(x)
[1] "character"
> x1 <- parse(text = x)
> class(x1)
[1] "expression"
eval: evaluate评估
待求值对象的类型可以是call类对象、表达式类对象或名称(在当前作用域中查找名称并求值其绑定)、promise或任何基本类型,如向量、函数和环境(返回时保持不变)。
将表达式类对象转换为数值。
用法:eval(expr) 其中expr表示要评估的对象
> x <- "2 ^ 3"
> eval(x)
[1] "2 ^ 3"
> x1 <- parse(text=x)
> eval(x1)
[1] 8
#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
> 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
使用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博客