String 如何使用函数的参数作为变量名?
我觉得这很琐碎,很抱歉问了这么简单的问题,但我希望能在以下问题上得到一些帮助:我有一个需要两个参数的函数:String 如何使用函数的参数作为变量名?,string,r,function,variables,arguments,String,R,Function,Variables,Arguments,我觉得这很琐碎,很抱歉问了这么简单的问题,但我希望能在以下问题上得到一些帮助:我有一个需要两个参数的函数: myfun <- function(fm, name){ ... } 此函数的目的是显示数据框中用于拟合fm的变量name的前五个元素。但是,name未被识别为相应数据帧中的变量。用和(df,…),df$name或等效的解决方案包装它都不会起作用。我如何让它工作 编辑: 我已经玩了一点,但它仍然不工作。在我受到一些评论的启发后,我认为这是应该起作用的: myfun <
myfun <- function(fm, name){
...
}
此函数的目的是显示数据框中用于拟合fm
的变量name
的前五个元素。但是,name
未被识别为相应数据帧中的变量。用和(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)
myfun您想要使用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给出的是前五行,而不仅仅是前五个元素
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)
air我有点困惑,但你可能只想[[/code>就像dat[[name]]]
一样……但你可能也在寻找get
。我特别困惑的是,为什么你需要评估你的数据……这个问题肯定令人困惑,而且可以从一个强大的重新评估中获益-write@Justin:str(fm$call$data)
显示这会产生一个“符号”作为输出,而str(eval(fm$call$data)
显示了相关的数据框。坦率地说,我从这里的另一个问题的答案中复制了这一点。对于如何使其更加优雅,我将非常感谢您的任何建议。看起来您正在处理的数据就像是模型的输出,对吗?您可以单独访问其组件,而无需太多的调用
技巧对数据进行加密使一切变得更加容易,只是为了使问题更加明显:我想从拟合模型中获取数据帧的原因是我经常使用不同的数据子集。子集必须在lm()中指定
并且我希望在更改它时避免在我的函数中再次指定它。键入lm(y~x,data=df[some lenghty condition]
和另外的myfun(fm,df[some lenghty condition]$variablename)
看起来既单调又低效。想象一下,将您的数据子集更改50次。将其包含到我的函数中会真正帮助我节省时间。很好,您已经有了它。不过,您可能需要研究编程方法来完成任务;)谢谢!这很有帮助!我甚至没有想到本地和全球环境,只是试图将我的字符串强制转换为其他格式。但现在我想起来了,这确实是一个简单且非常明显的解决方案。感谢您指出这一点!
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)