我正在使用source
加载其他R文件。使用 do.call,我从该 R 文件调用特定函数,并向其传递参数。我想在尝试调用 write.csv
之前检查从函数返回的东西是否实际上是 dplyr 对象。
我尝试对结果使用typeof
,但看起来我只是返回了list
。我可以使用类似于 is.data.frame
的东西吗?如果可以的话,我最终会调用 stop
,但在这种情况下最好提供更好的错误消息,而不是任何 write.csv
> 吐出来。
例如,给定这个 R 脚本,是否有办法判断返回的对象是否是 dplyr 对象?
library(dplyr)
dm_usa <- function(dm, caseSensitive) {
if (caseSensitive) {
dplyr::filter(dm, COUNTRY == "USA")
} else {
dplyr::filter(dm, tolower(COUNTRY) == "usa")
}
}
dm
参数是通过以下方式构造的:dplyr::tbl(connection, tableName)
,并在后台使用 dbplyr。
最佳答案
我建议保持简单:inherits(ret, "data.frame")
。
虽然dplyr
和 friend 们经常宣传“tbl_df”
,但他们仍然可以使用并返回data.table
和vanilla data.frame
无需重新分类(取决于操作)。因为它们都是真正的多类:
class(tibble::tibble(mtcars))
# [1] "tbl_df" "tbl" "data.frame"
class(data.table::data.table(mtcars))
# [1] "data.table" "data.frame"
class(mtcars)
# [1] "data.frame"
使用inherits
允许选择任何可用的类字符串,并且“data.frame”
将匹配所有三个。 (这与 class(obj) == "..."
的反模式相反,因为只有当 object 是单类对象时才有效,其中上面三个中的两个将无法按预期工作。)
关于r - 确定函数返回值是否为 dplyr 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73888949/