您可以使用
mget()
,并在其后加上
inherits=T
和
ifnotfound=list(NULL)
(或任何非数据框值),然后对每个应用
is.data.frame()
。
sapply(mget(tables,inherits=T,ifnotfound=list(NULL)),is.data.frame);
inherits=T
在这里是必须的,因为mtcars
不位于全局环境中,当您在顶级运行mget()
时,默认情况下会在全局环境中查找。它实际上位于内置数据集包的公共环境中。您可以使用find()
来确定对象所在的位置:
find('mtcars');
此外,这里有一些误解需要澄清。函数
as.name()
和
as.symbol()
是完全等价的。这些函数将给定的参数强制转换为符号类型。
符号类型是 R 语言本身的一部分,或者说是 R 解析树使用的 R 数据类型。换句话说,您可以说它是 R 的数据模型的一部分。有关此信息,请参见我在
此处的答案。
大多数时候,大多数 R 程序员不需要使用符号,因为它们不需要“计算语言”,通常称为(意味着它们不需要操作 R 解析树)。
在您的代码中,您使用
as.name()
将
tables[i]
中的字符串值强制转换为符号类型,然后将结果符号对象传递给
is.data.frame()
。这是不正确的。在符号对象上调用
is.data.frame()
总是会返回 false,因为符号不是 data.frame。通常,
is.*
函数作用于给定对象的类型;它们不执行任何“解析”、“查找”或“搜索”以查找参数所引用的最终对象;参数就是
is.*
函数正在测试类型的对象。
第二点,您不需要执行
== TRUE
。如果您已经有了逻辑值,那么它将已经为 true,在这种情况下,比较将使其保持为 true;或者它已经是 false,在这种情况下,比较将使其保持为 false(或者它已经是 NA,在这种情况下,比较将使其保持为 NA)。
有趣的是,在写完上面的解释后,我意识到有一种替代方法可以获得存储在字符串值中的名称的对象,它实际上涉及到我上面有些忽视的
as.symbol()
/
as.name()
函数。我说的是在符号对象上调用
eval()
:
head(eval(as.symbol(tables[3L])));
is.data.frame(eval(as.symbol(tables[3L])));
所以我们可以说你通过调用as.name()
是正确的。