我觉得这是微不足道的,我为提出这么简单的问题而道歉,但我会感谢以下问题的一些帮助:我有一个需要两个参数的函数:
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
访问它的数据框,但是某些东西仍然不起作用...... :(
答案 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)