问题描述
考虑
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