我有一个在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
,它处理所有提供的对象中的相应元素(在本例中为mft
和tt
)。
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)
你的提示应该会有所改变。检查元素i
、mft
和tt
,看看它们是否与您的MyFTable[[1]]
和t[[1]]
元素匹配。要退出,请键入Q
。