我有一个问题,在度过周末之后,我想寻求帮助。为了解释这个问题,我想直接跳到一个例子中:
df <- data.frame(x=rnorm(100), z=rnorm(100), y=rnorm(100), f=rep(1:5,length.out=100 ))
mod <- lm(y ~ x, data=df[df$z>0,])
我想回收模型的data-argument:
dat <- mod$call[['data']]
这给了我:
df[df$z > 0, ]
但是,str(dat)
会显示这是language
类型的对象。但是,我想使用此表达式来访问lm
中使用的数据帧(包括子设置),以获取另一个变量的相应值,例如f
。请注意,将语言对象转换为带有as.character()
的字符将导致字符向量,并且某些括号将丢失。
我想在函数中使用它,我想要的是这样的:
foo <- function(fm, "var.name"){
new <- paste(dat, "$", var.name, sep="")
newvar <- eval(parse(text=new), envir=.GlobalEnv)
... do stuff with newvar ...
}
如果我将f
指定为var.name
,则不使用子设置,此过程会为变量f
提供变量。通过子设置,我遇到parse
的问题,因为dat
现在是带括号的字符向量。
作为旁注:我想从data
- 函数中回收lm
- 参数而不是仅使用与var.name
相同的表达式的原因是我改变了经常进行子设置,并且从lm-object中识别它使我的生活变得更加容易。它还会删除错误源。
如果有人能帮助我,我会感激不尽......
答案 0 :(得分:3)
你可以像这样eval
这个表达式
foo <- function(model, varname) eval(model$call[["data"]])[,varname]
foo(mod, "f")
## [1] 2 5 2 5 1 2 1 5 2 3 1 2 3 1 3 4 1 3 4 1 2 3 2 4 1 4 1 2 4 5
## [31] 2 4 2 3 4 2 2 3 4 1 3 1 2