2013-05-14 180 views
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还是同等的解决方案来包装它都没关系。我如何使它起作用?

编辑: 我已经玩得更进一步,但它仍然无法正常工作。这就是我想我是有些意见的启发后,应该工作:即通过构建一个字符串 Error in get(d2): object 'airquality$Temp' not found. 我希望:

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的字符串,但我得到以下错误这给我的变量的名称,包括我可以访问它使用get,但仍然不能工作的数据帧的名称... :(

+3

我有点困惑,但你可能只是想'[['在'DAT [名]'...但你也可能正在寻找'get'。我特别困惑你为什么需要'评估'你的数据...... – Justin 2013-05-14 14:28:21

+0

这个问题当然令人困惑,并且可能受益于强大的重写 – 2013-05-14 14:35:54

+0

@Justin:'str(fm $ call $ data)'显示这会产生一个“符号”作为输出,而'str(eval(fm $ call $ data)'显示相关的数据帧。坦率地说,我从这里回答了另一个问题。我将不胜感激任何有关如何使这更优雅的建议。 – coffeinjunky 2013-05-14 14:50:21

回答

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) 
+0

谢谢!这有很大帮助!我甚至没有想到当地和全球的环境,只是试图强制我的字符串变成其他格式。但现在我想到了它,这确实是一个简单而明显的解决方案。感谢您指出了这一点! – coffeinjunky 2013-05-14 16:56:28

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))给你的是对象的名称。 如果你已经有一个资料片,你可以传递给函数,这将是更简单的使用

head(get(Name), 5) 

注意,头是给你的第一个五年,不只是第一五行

+0

只是为了使问题更加明显:我想从拟合模型中获取数据框的原因是我经常使用不同的数据子集。子集必须在'lm()'中指定,我想避免在我的函数中更改它时再指定它。键入'lm(y〜x,data = df [某些长条件]'另外'myfun(fm,df [某些长条件] $ variablename)'显得单调乏味,效率低下,想象一下将数据子集改为50次。包括这个到我的函数真的会帮我节省时间 – coffeinjunky 2013-05-14 16:22:27

+0

很好,那么你有它,虽然,你可能想看看编程方法来完成你的任务;) – 2013-05-14 16:27:12

相关问题