r - 对 data.table 使用 i 中变量的字符串表示
问题描述
显然我太愚蠢了,无法输入正确的搜索词,b/c 我认为我的问题根本不是唯一的。
i
部分中如何通过字符串引用变量data.table
?with
并且..x
都对这个j
部分有好处,但是这个部分的等价物是i
什么?我必须使用邪恶吗eval
(双关语;)
library(data.table)
dt <- data.table(x = 1:4, y = 4:1)
my_filter_fun <- function(var = names(dt)) {
var <- match.arg(var)
dt[eval(parse(text = paste(var, "== 1")))]
}
my_filter_fun("x")
my_filter_fun("y")
这样做的惯用方式是data.table
什么?来自dplyr
我想我正在寻找相当于 quosures 的data.table
?
额外的问题:我怎么能实现my_filter_fun
这样的调用
my_filter_fun(x > 1)
将返回相同的结果
dt[x > 1]
解决方案
对于您的第一个问题,我建议使用get()
来避免以下问题eval()
:
my_filter_fun <- function(var = names(dt)) {
var <- match.arg(var)
dt[get(var) == 1]
}
my_filter_fun("x")
x y
1: 1 4
对于奖金问题,您可以执行以下操作。它可能可以简化 - 只是我不知道如何。
bonus_filter_fun <- function(filter) {
filter <- deparse(substitute(filter))
dt[eval(parse(text = filter))]
}
bonus_filter_fun(x > 1)
x y
1: 2 3
2: 3 2
3: 4 1
推荐阅读
- python - 将高分辨率底部地形添加到 Cartopy 地图
- cmake - Clion 失败并收到 clang:错误:链接器命令失败,退出代码为 1,但它使用 clang++ 工作
- amazon-web-services - 无法将文件从本地推送到 s3
- typescript - 可选类型别名的交集
- python - Python 中的 MQTT on_message 超时
- swift - 如何从我的项目 SwiftUI 启动谷歌地图
- wso2 - 如何在 WSO2 API Manager 中配置 Key 配置(即:Token Endpoint 和 Revoke Endpoint)
- typescript - 未生成导入的类型
- unity3d - Unity Vector3 问题
- javascript - 获取“TypeError:'' 不是有效的 JavaScript MIME 类型。” 在 IOS Safari 上非常零星