R:如何使用;“数据”-lm公式的参数作为字符?

R:如何使用;“数据”-lm公式的参数作为字符?,r,character,formula,lm,objectname,R,Character,Formula,Lm,Objectname,我有一个问题,在度过周末后,我想寻求帮助。为了解释这个问题,我想直接跳到一个例子: 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,]) 但是,str(dat)将显示这是语言类型的对象。但是,我想使用此表达式访问已在lm中使用的数据帧(包括子设置),以获取另一个变量的相应值,例如f。请

我有一个问题,在度过周末后,我想寻求帮助。为了解释这个问题,我想直接跳到一个例子:

 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,])
但是,
str(dat)
将显示这是
语言类型的对象。但是,我想使用此表达式访问已在
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 ... 
 }

foo你可以像这样
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

foo您看过
deparse()
了吗?
mod$model
呢?它将有
x
y
,够了吗?本,非常感谢!实际上,我在代码的另一部分中使用了deparse。让人尴尬的是,我没有想到这一点。谢谢!没错,这也很有用。不过我想我会同意本的建议。我认为eval会在本地环境中复制对象(这里是:数据帧),对吗?因为我的真实数据帧是巨大的,所以出于计算目的,我希望避免这种情况。不过还是要谢谢你!是的,确实是
eval
在临时环境中复制对象,但您也必须检查
deparse
解决方案的内存使用情况,我没有亲自尝试。是的,我同意。我现在正在比较两种方法,令人惊讶的是,deparse解比eval解慢。但其他事情也不同。稍后,我将对此进行更多的研究,只是向其他读者提及这一点。无论如何,多谢你,迪科阿!你们真的很有帮助。仅供参考,计算表达式的正确环境是
环境(model$terms)
-如果数据是在函数中创建的对象,则此函数仍然有效
 foo <- function(fm, "var.name"){
      new <- paste(dat, "$", var.name, sep="")
      newvar <- eval(parse(text=new), envir=.GlobalEnv)
      ... do stuff with newvar ... 
 }
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