【问题标题】:lapply of list in ReporteRs packagesReporteRs 包中列表的 lapply
【发布时间】:2016-07-26 18:27:05
【问题描述】:

我有一个在ReporteRs 包中创建的名称列表和表列表,称为“MyFTable”,我尝试将 MyFTable 列表与 t 列表一起应用

t1 <- c("a","b","c")
t2 <- c("d","e","f")
t <- list(t1, t2)

如果我单独做,它可以工作,但是当我放入循环时,它就不起作用了。

  addHeaderRow(MyFTable[[1]], value=c("", t1))
  addHeaderRow(MyFTable[[2]], value=c("", t2))

这是我的尝试:

  for(i in 1: length(MyFTable)){
  lapply(MyFTable[[i]],function(x) addHeaderRow(x, value=c("",t[[i]])))
}

for(i in 1: length(MyFTable)){
  lapply(MyFTable[[i]],function(x) addHeaderRow(x[[i]], value=c("",t[[i]])))
}

我有错误:

x 必须是 FlexTable

感谢您的建议。

【问题讨论】:

  • 你为什么要lapplying in for-loop?使用其中之一,如果您要使用for-loops,请预先分配。
  • 我尝试用第一个名称列表应用第一个df列表

标签: r loops lapply reporters


【解决方案1】:

您无缘无故地添加lapply。您可以在常规循环中执行此操作。

out <- vector("list", length(MyFTable)) # always pre-allocate

for(i in 1:length(MyFTable)){
  out[[i]] <- addHeaderRow(MyFTable[[i]], value=c("",t[[i]])))
}

您还可以使用mapply,它适用于所有提供的对象中的相应元素(在本例中为mfttt)。

myFun <- function(mft, tt) addHeaderRow(mft, tt)
mapply(FUN = myFun, mft = MyFTable, tt = t)

如果你一心想要lapply,你可以“隐藏一个循环”。

lapply(1:length(MyFTable), FUN = function(i, mft, tt) {
  addHeaderRow(mft[[i]], value = c("", tt[[i]]))
}, mft = MyFTable, tt = t)

最后一段代码很有趣,因为它很容易展示 R 中的调试工作原理。通过在函数中的某个点设置 browser(),执行将在该点停止,您可以检查元素或通过键入推进nc。第一个命令将向前移动一行(来自browser() 调用),c 将执行当前“循环”并在下一个循环中的browser() 行等待(如果未完成,则存在)。

试试看,执行

lapply(1:length(MyFTable), FUN = function(i, mft, tt) {
  browser()
  addHeaderRow(mft[[i]], value = c("", tt[[i]]))
}, mft = MyFTable, tt = t)

你的提示应该会有所改变。检查元素 imfttt 并查看它们是否与您的 MyFTable[[1]]t[[1]] 元素匹配。要退出,请输入Q

【讨论】:

  • 所以如果我有另一个函数 MyFTable[1,1:10, newpar=TRUE, to="header"]
  • 我尝试 for(i in 1:length(MyFTable)){MyFTable[[i]][1,1:10, newpar=TRUE, to="header"]
  • @Stat 在这一点上,我将要求您提出一个新问题并提供一个可重现的示例。 Here are some tips 如何做到这一点。
  • 我会研究一下,谢谢你的提前
猜你喜欢
  • 1970-01-01
  • 2018-03-06
  • 2014-01-21
  • 2017-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多