r-ReporteRs包中列表的lapply



我有一个在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

谢谢你的建议。

您添加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

相关内容

  • 没有找到相关文章

最新更新