可以使数据框接受 alists 作为行吗?

问题描述

考虑

items<-alist(2^1,2^2,2^3,2^3)

假设我想构建一个数据框,其中 items 中未计算的表达式是一列,而它们的计算版本在另一列中。换句话说,我想要类似的东西:

items           results
2^1                   1
2^2                   4
2^3                   8
2^3                   8

作为我的输出。我会使用 row.names 参数,但它拒绝重复的名称,否则无法说服。

尝试自然是

items<-alist(2^1,2^3)
outs<-sapply(items,eval)
data.frame(items=items,results=outs)

输出似乎将 alist 的每个元素视为列名:

> data.frame(items=items,results=outs)
  items.2.1 items.2.2 items.2.3 items.2.3.1 results
1         2         4         8           8       2
2         2         4         8           8       4
3         2         4         8           8       8
4         2         4         8           8       8

lapply 并不公平:

> outs<-lapply(items,eval)
> data.frame(items=items,results=outs)
  items.2.1 items.2.2 items.2.3 items.2.3.1 results.2 results.4 results.8 results.8.1
1         2         4         8           8         2         4         8           8

我知道我可以使用矩阵而不是数据框,但这不是我要问的。

解决方法

@nicola 在评论中的建议几乎有效,但无法正确显示:

> data.frame(items=I(items),results=vapply(items,eval,1))
    items results
1 ^,2,1       2
2 ^,2       4
3 ^,3       8
4 ^,3       8

如果你不关心显示器,我会使用它。如果你想让它显示得很好,你需要将语言对象转换为表达式对象,例如

eitems <- lapply(items,as.expression)
> data.frame(items=I(eitems),1))
  items results
1   2^1       2
2   2^2       4
3   2^3       8
4   2^3       8

或者如果您不想再次评估它们,则将它们分解为字符值:

ditems <- sapply(items,deparse)
> data.frame(items = ditems,1))
  items results
1   2^1       2
2   2^2       4
3   2^3       8
4   2^3       8