2

我在 R 内存中有一个p结构,我正在尝试访问Rate矩阵的列。

当我p$6597858$Sample在控制台中输入时,我得到...

 p$`6597858`$Sample
        Rate             Available                 X                    Y
[1,]    1.01              1520.93                0.00                  0.0
[2,]    1.02               269.13                0.00                  0.0
[3,]    1.03               153.19                0.00                  0.0
[4,]    1.04               408.80                0.00                  0.0

等等 ...

当我尝试在我的代码中

get("p$`6597858`$Sample[,1]") 

我得到这个返回...

object 'p$`6597858`$Sample[ ,1]' not found

这是一个撇号问题吗?

4

1 回答 1

4

$the和操作符都不能在其中[[工作get()(因为p[[1]]它不是 R 对象,它是 object 的一个组件p)。

你可以试试

p <- list(`6597858`=list(Sample=data.frame(Rate=1:3,Available=2:4)))
z <- eval(parse(text="p$`6597858`$Sample[,1]"))

但这可能是个坏主意。有没有理由

z <- p[["6597858"]][["Sample"]][,"Rate"]

不做你想做的事?

您可以通过使用character变量进行索引来动态执行此操作,但仍不使用get: 例如

needed <- 1234
x <- p[[as.character(needed)]][["Sample"]][,"Rate"]

编辑:Hadley Wickham 在评论中建议)或

x <- p[[c(as.character(needed),"Sample","Rate")]]

如果第二低级元素是数据框或列表:如果它是矩阵,则此替代方法不起作用,您需要p[[c(as.character(needed),"Sample")]][,"Rate"]改为)

在这种情况下,弄清楚语言的习语并使用它(而不是与之抗争)会得到回报......

library(fortunes)
fortune(106)

If the answer is parse() you should usually rethink the question.
   -- Thomas Lumley
      R-help (February 2005)

一般来说,

  • 直接从列表中提取元素比使用更好(更安全,减少复杂的代码)get()
  • 对列表元素使用非标准名称(即那些需要用反引号保护的纯数字)是不明智的
  • [[$
于 2012-10-12T13:15:41.277 回答