r - 使用非标准评估按多列排序
问题描述
假设我想订购一个data.frame
使用多列并使用非标准演变的产品。我可能有一个看起来像这样的函数
my_order <- function(data, ...) {
with(data, order(...))
}
使用此函数时出现错误,因为我的列未在with
.
my_order(mtcars, mpg, cyl)
# Error in order(...) : object 'mpg' not found
注意:我不希望使用dplyr::arrange()
这个问题,因为它增加了一个依赖。
解决方案
这是使用基数 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)
推荐阅读
- c# - 在 Azure Blob 存储中处理上传的 Zip 文件
- puppeteer - 如何使用 Puppeteer 点击通过 Reactjs 运行的链接?
- php - 此处的初始选项卡不通过 API 遵守“可选”标志
- mongodb - 覆盖缺失值的mongodb索引
- reset - 如何调整每个标签页的脚本以重置整个页面并仅重置公式和 Dropbox?
- c# - C# 从对象中获取属性值
- snowflake-cloud-data-platform - 爱因斯坦连接到雪花 - JDBC 错误
- excel - 使用新名称保存后 Excel 无法找到文件
- azure - Can't run my build release task on azure release pipeline error 异常:初始化名为“MSTest”的设置提供程序时出错
- r - 如何增加 facet_wrap 中每个图的大小?