R 是否可以使数据框接受Alist作为行?

R 是否可以使数据框接受Alist作为行?,r,dataframe,names,R,Dataframe,Names,考虑 items<-alist(2^1,2^2,2^3,2^3) 作为我的输出。我会使用row.names参数,但它拒绝重复的名称,否则无法确定 尝试的自然方式是 items<-alist(2^1,2^2,2^3,2^3) outs<-sapply(items,eval) data.frame(items=items,results=outs) lappy并不公平: > outs<-lapply(items,eval) > data.frame(items

考虑

items<-alist(2^1,2^2,2^3,2^3)
作为我的输出。我会使用
row.names
参数,但它拒绝重复的名称,否则无法确定

尝试的自然方式是

items<-alist(2^1,2^2,2^3,2^3)
outs<-sapply(items,eval)
data.frame(items=items,results=outs)
lappy
并不公平:

> 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
输出数据帧(项目=项目,结果=输出) 项目2.1项目2.2项目2.3项目2.3.1结果2结果4结果8结果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, 2       4
3 ^, 2, 3       8
4 ^, 2, 3       8
如果你不在乎显示器,我会用它。如果您想让它很好地显示,您需要将语言对象转换为表达式对象,例如

eitems <- lapply(items, as.expression)
> data.frame(items=I(eitems),results=vapply(items,eval,1))
  items results
1   2^1       2
2   2^2       4
3   2^3       8
4   2^3       8
eitems data.frame(items=I(eitems),results=vapply(items,eval,1))
项目结果
1   2^1       2
2   2^2       4
3   2^3       8
4   2^3       8
或者,如果不想再次计算它们,只需将它们分解为字符值:

ditems <- sapply(items, deparse)
> data.frame(items = ditems, results=vapply(items,eval,1))
  items results
1   2^1       2
2   2^2       4
3   2^3       8
4   2^3       8
ditems data.frame(items=ditems,results=vapply(items,eval,1))
项目结果
1   2^1       2
2   2^2       4
3   2^3       8
4   2^3       8

当您希望列表成为单列时,请使用
I
函数:
data.frame(items=I(items),results=vapply(items,eval,1))
。您知道
I()
的用法记录在哪里吗?我看不出任何明显的地方,即使是
I()
本身的文档。@J.Mini
?I
?data.frame
(详细信息部分)讨论
I
的用法。
deparse
解决方案似乎比
as.expression
解决方案简单得多,我不确定您为什么提到
as.expression
。对于这些情况,是否有理由不使用
deparse
替代?
deparse()
不保证成功。有一些奇怪的R对象,它无法处理。我想它可以处理
alist()
将产生的任何东西,但我可能错了。计算表达式的值与对其进行去粗化、解析和计算的值不同,这一点也非常普遍。最常见的原因是在除法期间舍入,例如1.000000000000001除法为1,但在内部它不等于1。
eitems <- lapply(items, as.expression)
> data.frame(items=I(eitems),results=vapply(items,eval,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, results=vapply(items,eval,1))
  items results
1   2^1       2
2   2^2       4
3   2^3       8
4   2^3       8