如何使用函数的参数作为变量的名称?

时间:2013-05-14 14:20:34

标签: string r function variables arguments

我觉得这是微不足道的,我为提出这么简单的问题而道歉,但我会感谢以下问题的一些帮助:我有一个需要两个参数的函数:

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访问它的数据框,但是某些东西仍然不起作用...... :(

2 个答案:

答案 0 :(得分: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会为您提供前五个,而不只是前五个元素

答案 1 :(得分: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)