为sort.data.frame创建通用/方法一致性的最佳方法? [英] Best way to create generic/method consistency for sort.data.frame?
问题描述
我终于决定把在互联网上漂浮的sort.data.frame方法放到R包中。
I've finally decided to put the sort.data.frame method that's floating around the internet into an R package. It just gets requested too much to be left to an ad hoc method of distribution.
但是,它的参数使它与通用排序函数不兼容:
However, it's written with arguments that make it incompatible with the generic sort function:
sort(x,decreasing,...)
sort.data.frame(form,dat)
如果我改变 sort.data.frame
一个参数如 sort.data.frame(form,decrease,dat)
并丢弃减少,那么它失去了它的简单性,因为你总是必须指定 dat =
,并且不能真正使用位置参数。如果我将它添加到 sort.data.frame(form,dat,decrease)
中,则该顺序与通用函数不匹配。如果我希望减少在点'sort.data.frame(form,dat,...),然后当使用基于位置匹配时,我相信泛型函数将分配第二个位置为减少,它会得到丢弃。
If I change sort.data.frame
to take decreasing as an argument as in sort.data.frame(form,decreasing,dat)
and discard decreasing, then it loses its simplicity because you'll always have to specify dat=
and can't really use positional arguments. If I add it to the end as in sort.data.frame(form,dat,decreasing)
, then the order doesn't match with the generic function. If I hope that decreasing gets caught up in the dots `sort.data.frame(form,dat,...), then when using position-based matching I believe the generic function will assign the second position to decreasing and it will get discarded. What's the best way to harmonize these two functions?
完整的功能是:
# Sort a data frame
sort.data.frame <- function(form,dat){
# Author: Kevin Wright
# http://tolstoy.newcastle.edu.au/R/help/04/09/4300.html
# Some ideas from Andy Liaw
# http://tolstoy.newcastle.edu.au/R/help/04/07/1076.html
# Use + for ascending, - for decending.
# Sorting is left to right in the formula
# Useage is either of the following:
# sort.data.frame(~Block-Variety,Oats)
# sort.data.frame(Oats,~-Variety+Block)
# If dat is the formula, then switch form and dat
if(inherits(dat,"formula")){
f=dat
dat=form
form=f
}
if(form[[1]] != "~") {
stop("Formula must be one-sided.")
}
# Make the formula into character and remove spaces
formc <- as.character(form[2])
formc <- gsub(" ","",formc)
# If the first character is not + or -, add +
if(!is.element(substring(formc,1,1),c("+","-"))) {
formc <- paste("+",formc,sep="")
}
# Extract the variables from the formula
vars <- unlist(strsplit(formc, "[\\+\\-]"))
vars <- vars[vars!=""] # Remove spurious "" terms
# Build a list of arguments to pass to "order" function
calllist <- list()
pos=1 # Position of + or -
for(i in 1:length(vars)){
varsign <- substring(formc,pos,pos)
pos <- pos+1+nchar(vars[i])
if(is.factor(dat[,vars[i]])){
if(varsign=="-")
calllist[[i]] <- -rank(dat[,vars[i]])
else
calllist[[i]] <- rank(dat[,vars[i]])
}
else {
if(varsign=="-")
calllist[[i]] <- -dat[,vars[i]]
else
calllist[[i]] <- dat[,vars[i]]
}
}
dat[do.call("order",calllist),]
}
例如:
library(datasets)
sort.data.frame(~len+dose,ToothGrowth)
推荐答案
这里有一些问题。 sort.data.frame
需要与通用参数具有相同的参数,因此至少需要
There are a few problems there. sort.data.frame
needs to have the same arguments as the generic, so at a minimum it needs to be
sort.data.frame(x, decreasing = FALSE, ...) {
....
}
要调度工作,第一个参数需要是发送的对象。所以我从开始:
To have dispatch work, the first argument needs to be the object dispatched on. So I would start with:
sort.data.frame(x, decreasing = FALSE, formula = ~ ., ...) {
....
}
其中 x
是您的 form , / code>,我们提供了一个默认的公式来包括一切。 (我没有详细研究你的代码,看看
形式代表什么)。
where x
is your dat
, formula
is your form
, and we provide a default for formula to include everything. (I haven't studied your code in detail to see exactly what form
represents.)
不需要在调用中指定减少
,因此:
Of course, you don't need to specify decreasing
in the call, so:
sort(ToothGrowth, formula = ~ len + dose)
将是如何使用上述
否则,如果你不想将 sort.data.frame
它是别的东西,然后你可以随意拥有你想要的任何参数。
Otherwise, if you don't want sort.data.frame
to be an S3 generic, call it something else and then you are free to have whatever arguments you want.
这篇关于为sort.data.frame创建通用/方法一致性的最佳方法?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!