我想编写一个采用数据帧的函数,并将该数据帧中的所有列绘制为直方图.
对于我之前知道的列名的数据帧,我可以写
qplot(colname1, data=df, geom='histogram')
qplot(colname2, data=df, geom='histogram')
...
Run Code Online (Sandbox Code Playgroud)
但我想这样做,所以我可以使用列的名称作为字符串"colname1"
.
换句话说,怎么写
plot_histogram_of_column <- function(df, colname) {
# qplot(colname, data=df, geom='histogram') won't work
}
Run Code Online (Sandbox Code Playgroud) 我想创建一个几乎是数据框架的类,有一些增强功能(额外的功能,额外的属性),我想知道最好的方法是什么.该类基本上是一个数据框,但有一些额外的属性,例如该数据框的模式(下面命名为"form",自动派生,表示为数据框,用于将数据框转换为正确的类型),还有其他几件事.当用户在其他不识别其特殊类型的函数中使用此对象时,我希望它们处理对象的data.frame部分.做这个的最好方式是什么?
我发现的两种方法都不令人满意; 我列出了他们以及我仍然看到并试图解决的问题; 问题是:做我想做的最好的方法是什么?
方法1,使用"data.frame"作为"基础"插槽 (受此SO帖子的启发)
setClass("formhubData", representation(form="data.frame"), contains="data.frame")
fd <- new('formhubData', data.frame(x=c(1,2)), form=data.frame(name='x', type='select one', label='X'))
Run Code Online (Sandbox Code Playgroud)
这种方法允许我做以下事情:
fd$x >> 1 2
names(fd) >> "x"
Run Code Online (Sandbox Code Playgroud)
[更新:事实证明"分解"是由我的环境造成的,我用不同的参数反复调用setClass('formhubData',...).在新的R会话中,以下所有函数都按预期工作.]
但它很快崩溃了:
nrow(fd) >> NULL
colnames(fd) >> NULL
Run Code Online (Sandbox Code Playgroud)
与上面链接的帖子不同,即使简单is.data.frame
也不适用于我
is.data.frame >> FALSE
Run Code Online (Sandbox Code Playgroud)
方法2,使用"数据"插槽(灵感来自SP)
setClass("formhubData", representation(data="data.frame", form="data.frame"))
fd <- new('formhubData', data=data.frame(x=c(1,2)), form=data.frame(name='x', type='select one', label='X'))
Run Code Online (Sandbox Code Playgroud)
我失去了默认定义:
fd$x >> NULL
names(fd) >> integer(0)
Run Code Online (Sandbox Code Playgroud)
但是,至少我可以重新定义它们中的大多数(仍然需要了解[,[[等等):
dim.formhubData <- function(x) dim(x@data)
names.formhubData <- function(x) names(x@data)
nrow(fd) >> 2
names(fd) >> "x"
Run Code Online (Sandbox Code Playgroud)
但是,我似乎无法表达这样一个事实:对于任何采用data.frame的方法,我的类应该用作其@data插槽的直通.我觉得这样的事情需要 *.formhubData <- function(x, ...) *(x, …