ReporteRs 包中的列表 lapply

lapply of list in ReporteRs packages

我有一个名称列表和 table 列表,它们在 ReporteRs 包中创建,名为 "MyFTable",我尝试将 MyFTable 列表与 t[=16 列表一起应用=]

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 must be a FlexTable

感谢您的建议。

您无故添加 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,你可以 "hide a loop"。

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 将执行当前 "loop" 并在下一个循环的 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.