, Вы можете увидеть реализованные методы с

онец решил поместить метод sort.data.frame, который распространяется по Интернету, в пакет R. Он слишком часто запрашивается, чтобы оставить его для специального метода распространения.

Однако он написан с аргументами, которые делают его несовместимым с общей функцией сортировки:

sort(x,decreasing,...)
sort.data.frame(form,dat)

Если я изменюsort.data.frame принять уменьшение в качестве аргумента, как вsort.data.frame(form,decreasing,dat) и отказаться от уменьшения, то он теряет свою простоту, потому что вы всегда должны будете указатьdat= и не может реально использовать позиционные аргументы. Если я добавлю его в конец, как вsort.data.frame(form,dat,decreasing), тогда порядок не совпадает с универсальной функцией. Если я надеюсь, что уменьшение попадает в точки `sort.data.frame (form, dat, ...), то при использовании сопоставления на основе позиции я полагаю, что универсальная функция назначит вторую позицию уменьшению и получит отбрасываются. Каков наилучший способ согласовать эти две функции?

Полная функция:

# 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)

Ответы на вопрос(4)

Ваш ответ на вопрос