r - 如何测试函数参数是否是“quosurable”名称?
问题描述
我正在制作一个应该能够为其第一个参数处理多个类的函数:公式、字符、tidy-selection、var 名称......然后目标是使用 tidyselection tidyselect::vars_select
,除了裸公式。
问题是当我测试这个参数的类时,如果该值是一个要整齐选择的名称,它会抛出一个错误,因为它会被认为是一个未找到的对象。
我找到了一个解决方法tryCatch
,如果它的评估失败(因此如果它不存在于这个范围内),它会引用第一个参数。
library(rlang)
foo=function(.vars){
.vars2=tryCatch(.vars, error=function(e) enquo(.vars))
print(class(.vars2))
print(class(.vars))
}
foo(Species)
# [1] "quosure" "formula"
# Error in print(class(.vars)) : object 'Species' not found
# In addition: Warning message:
# In print(class(.vars)) : restarting interrupted promise evaluation
foo(~Species)
# [1] "formula"
# [1] "formula"
foo(1)
# [1] "numeric"
# [1] "numeric"
foo("Species")
# [1] "character"
# [1] "character"
这对我来说似乎并不干净,因为我在没有过滤我的具体案例的情况下捕获了所有错误。
是否有一个内置函数来测试这个,或者比这个解决方法更干净的解决方案?
解决方案
我认为以下是您正在尝试做的事情(此处仅使用 base R)。
foo=function(.vars) {
.vars2 = substitute(.vars)
ifelse(is.symbol(.vars2), class(.vars2), class(.vars))
}
foo(Species)
#[1] "name"
foo(~Species)
#[1] "formula"
foo(1)
#[1] "numeric"
foo("Species")
#[1] "character"
推荐阅读
- sql - 执行sql前检查时间
- sql-server - 使用领先或滞后的 T-SQL 问题
- google-app-engine - 向第三方授予对 Google Cloud Storage 存储分区的访问权限
- python - 去掉json对象最后一个对象的逗号
- c# - 在 C# 中的 Selenium Web 驱动程序中等待标签标记文本
- ios - 应用因截图被拒绝,我现在该怎么办?
- javascript - 在 bootstrap-vue 选择选项中插入图像
- ag-grid - 防止在外部单击时以弹出模式关闭单元格编辑器
- arrays - 使用索引遍历 vue 数组
- function - 我如何编写具有以下 OCaml 类型的函数定义