【问题标题】:print table in R using names from vector使用向量中的名称在 R 中打印表
【发布时间】:2015-03-13 19:44:35
【问题描述】:

我正在尝试创建一些表格对象,我可以将它们插入到不使用 Knit 的 html 页面中,并且希望能够循环遍历名称向量以打印相应的表格。

例如:

TabA = as.table(cbind(c("A","B","C"),c(1,2,3)))
TabB = as.table(cbind(c("D","E","F"),c(1,2,3)))

nams = c("TabA","TabB")

然后在html中使用R markdown

Example Table: `r nams[4] `

```{r}
knitr::kable(t(nams[4]),format = "markdown")
```

我知道如何动态分配名称,但不确定如何使用向量作为指向对象的指针。

【问题讨论】:

  • 您可以使用get,例如tab = get(nams[i])print(get(nams[i]))
  • 为什么不tabs = list(TabA, TabB); lapply(tabs, print) ?这是对R的更好使用
  • 为什么更好地使用 R?
  • 我不清楚您真正想要做什么,但作为旁注 as.table(cbind(...)) 可能不是创建数据的最佳方式,甚至不是您所期望的,因为数字向量 @ 987654329@ 转换为字符。最近有一个类似的问题in this question

标签: r


【解决方案1】:

不确定 html 文件的来源,但对于名称问题,使用列表可能更明智(从而避免对字符串进行任何评估):

my.tables <- list(TabA=as.table(cbind(c("A","B","C"),c(1,2,3))),
                  TabB=as.table(cbind(c("D","E","F"),c(1,2,3))))

for(tab.name in names(my.tables))
  print(my.tables[[tab.name]])

# Or if you don't like loops
invisible(lapply(my.tables, print))

#   A B
# A A 1
# B B 2
# C C 3
#   A B
# A D 1
# B E 2
# C F 3

【讨论】:

    【解决方案2】:

    您可以使用get,如:

    tab = get(nams[i])print(get(nams[i]))

    get("string") 返回名称等于 "string" 的对象

    【讨论】:

      【解决方案3】:

      eval(parse(text="some clever text here")) 将接受一个字符串并将其作为表达式求值。您可以尝试以下方法

      for(i in names) {
          print(eval(parse(text = i)))
      }
      

      解析:https://stat.ethz.ch/R-manual/R-devel/library/base/html/eval.html

      评估:https://stat.ethz.ch/R-manual/R-devel/library/base/html/parse.html

      【讨论】:

        【解决方案4】:

        如果您只想要打印的副作用,那么这会成功,没有循环或笨拙eval(parse(.))mget 函数提供隐式循环:

        invisible(sapply( mget(nams), print))
          A B
        A A 1
        B B 2
        C C 3
          A B
        A D 1
        B E 2
        C F 3
        

        invisible 用于抑制print 返回给sapply 的额外值。如果将结果分配给临时变量,也可以删除不可见的包装器。

        【讨论】:

        • 可以,但我必须在表格之间放置文本。
        • 如果你没有完全描述问题,那么答案完全令人满意的可能性很低。
        • 我希望能澄清这个问题。你说得对,我不清楚。
        【解决方案5】:

        你应该使用 eval 和 as.name

        TabA = as.table(cbind(c("A","B","C"),c(1,2,3))) 
        TabB = as.table(cbind(c("D","E","F"),c(1,2,3)))
        
        nams = c("TabA","TabB")
        
        for (i in 1:length(nams)) {
            print(eval(as.name(nams[i])))
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-12-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多