检查数据框是否存在。

21

如果你有数据框名称的字符串,那么检查数据框是否存在的首选方式是什么?我能想到以下几种:

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

2
我会选择第二个选项。但是如果你想将其包装在一个函数中,那么“iris”或df_name必须更改,以便使用相同的名称。 - IRTFM
4个回答

31
第二个选项可以缩短为:
exists(df_name) && is.data.frame(get(df_name))

运算符&&允许惰性求值,即只有在第一个语句返回TRUE时才会计算第二个语句。


2

对于任何像我一样在多年后偶然发现并粗心地将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

1

exists("df_name")会返回TRUE(如果数据框存在)和FALSE(如果不存在)。那么为什么要这样做呢?第一个响应中的trycatch语句没有起作用,输出始终为FALSE。


也许你的回应只是检查一个对象是否存在,而不是该对象是否存在于数据框中? - Mark Miller
1
此外,tryCatch语句对我返回了TRUE - Mark Miller

0

另外一个

ifelse(any(ls() %in% "a"), is.data.frame(get("a")),FALSE)

1
这似乎是对 ifelse() 的不当使用,并且未将“搜索”扩展到可能不在全局环境中的可用系统数据集。 - IRTFM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接