首页 > 解决方案 > 使用非标准评估按多列排序

问题描述

假设我想订购一个data.frame使用多列并使用非标准演变的产品。我可能有一个看起来像这样的函数

my_order <- function(data, ...) {
  with(data, order(...))
}

使用此函数时出现错误,因为我的列未在with.

my_order(mtcars, mpg, cyl)
# Error in order(...) : object 'mpg' not found 

注意:我不希望使用dplyr::arrange()这个问题,因为它增加了一个依赖。

标签: rnon-standard-evaluation

解决方案


这是使用基数 R 传递未解析符号的一种方法

my_order <- function(data, ...) {
  dots <- substitute(...())
  with(data, do.call("order", as.list(dots)))
}
my_order(mtcars, mpg, cyl)

基本上我们使用替代来捕获符号名称,然后使用do.call将它们注入到对order.

或者,您可以考虑重新编写对函数的调用并更改评估环境

my_order <- function(data, ...) {
  call <-match.call()
  call[[1]] <- quote(order)
  call[2] <- NULL
  eval(call, data, parent.frame())
}
my_order(mtcars, mpg, cyl)

推荐阅读