如果你有数据框名称的字符串,那么检查数据框是否存在的首选方式是什么?我能想到以下几种:
df_name <- 'iris'
# Option 1
tryCatch(is.data.frame(get(df_name)), error=function(cond) FALSE)
# Option 2
if (exists(df_name)) is.data.frame(get(df_name)) else FALSE
exists(df_name) && is.data.frame(get(df_name))
运算符&&
允许惰性求值,即只有在第一个语句返回TRUE
时才会计算第二个语句。
对于任何像我一样在多年后偶然发现并粗心地将df_name
误解为数据框名称的人,我要提醒一下...它不是。正如原帖中明确说明的那样,它是一个字符串。
如果使用实际的数据框名称,在两种情况下都必须将数据框名称用引号括起来:
df <- setNames(data.frame(matrix(c(1,2,3,4),nrow=2,ncol=2)), c("a","b"))
exists(df) && is.data.frame(get(df))
Error in exists(df) : invalid first argument
exists("df") && is.data.frame(get(df))
Error in get(df) : invalid first argument
exists("df") && is.data.frame(get("df"))
[1] TRUE
exists("df_name")会返回TRUE(如果数据框存在)和FALSE(如果不存在)。那么为什么要这样做呢?第一个响应中的trycatch语句没有起作用,输出始终为FALSE。
tryCatch
语句对我返回了TRUE
。 - Mark Miller另外一个
ifelse(any(ls() %in% "a"), is.data.frame(get("a")),FALSE)
ifelse()
的不当使用,并且未将“搜索”扩展到可能不在全局环境中的可用系统数据集。 - IRTFM
df_name
必须更改,以便使用相同的名称。 - IRTFM