0

我有一个名称列表和在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

谢谢你的建议。

4

1 回答 1

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]])))
}

您还可以使用mapplywhich 适用于所有提供的对象(在本例中为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()在函数中设置某个点,执行将在该点停止,您可以检查元素或通过键入n或前进c。第一个命令将向前移动一行(从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

于 2016-07-26T18:47:30.230 回答