2

我觉得这是微不足道的,对于提出如此简单的问题,我深表歉意,但对于以下问题,我将不胜感激:我有一个需要两个参数的函数:

myfun <- function(fm, name){
  ... 
}

我可以通过dat <- eval(fm$call$data)函数内部获取要使用的数据框。在里面dat,有一个名称与第二个参数相同的变量,即有一个变量dat$name(请注意,函数的第二个参数不包括对数据框的引用,即名称不等于dat$name但只是name),我想使用该变量。

问:我该怎么做?

具体示例: 以下为示例:

  air <- data(airquality)
  fm <- lm(Ozone ~ Solar.R, data=airquality)
  myfun <- function(fm, name){
  df <- eval(fm$call$data)
  name[1:5]
  }

  myfun(fm, Temp)

此函数的目的是显示name数据框中已用于拟合的变量的前五个元素fm。但是,name不被识别为相应数据框中的变量。with(df, ...)用或df$name等效的解决方案包装它都不能解决问题。我如何让它工作?

编辑: 我已经玩得更远了,但它仍然无法正常工作。在受到一些评论的启发后,我认为应该这样做:

  myfun <- function(fm, name){
  df <- as.character(fm$call$data)
  varname <- deparse(substitute(name))
  d1 <- paste(df, "$", sep="")
  d2 <- paste(d1, varname, sep="")
  get(d2)[1:5]
  }

  myfun(fm, Temp)

这会产生一个名为 的字符串airquality$Temp,但我收到以下错误: Error in get(d2): object 'airquality$Temp' not found. 我希望通过构造一个字符串,该字符串为我提供了变量的名称,包括我可以使用的数据框访问它get,但仍然无法正常工作......: (

4

2 回答 2

3

您想使用get,但是不能保证 data.frame 会在那里。

> head(get(as.character(fm$call$data)), 5)
  Ozone Solar.R Wind Temp Month Day
1    41     190  7.4   67     5   1
2    36     118  8.0   72     5   2
3    12     149 12.6   74     5   3
4    18     313 11.5   62     5   4
5    NA      NA 14.3   56     5   5

但是,as.character(fm$call$data))给您的只是对象的名称data.frame。如果您已经拥有可以传递给函数的那条信息,那么使用起来会简单得多

 head( get(Name), 5)

请注意 head 给你前五行而不仅仅是前五个元素

于 2013-05-14T15:17:37.040 回答
2

使用您的示例,

air <- data(airquality)
fm <- lm(Ozone ~ Solar.R, data=airquality)

myfun <- function(fm, name){
  dn <- fm$call[['data']]
  varname <- deparse(substitute(name))
  get(as.character(dn),envir=.GlobalEnv)[varname]
}

myfun(fm, Temp)
于 2013-05-14T16:47:24.387 回答