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
,它适用于所有提供的对象中的相应元素(在本例中为 mft
和 tt
)。
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()
,执行将在该点停止,您可以检查元素或通过键入 n
或 c
前进。第一个命令将向前移动一行(从 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)
您的提示应该会有所改变。检查元素 i
、mft
和 tt
并查看它们是否与您的 MyFTable[[1]]
和 t[[1]]
元素匹配。要退出,请键入 Q
.
我有一个名称列表和 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
,它适用于所有提供的对象中的相应元素(在本例中为 mft
和 tt
)。
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()
,执行将在该点停止,您可以检查元素或通过键入 n
或 c
前进。第一个命令将向前移动一行(从 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)
您的提示应该会有所改变。检查元素 i
、mft
和 tt
并查看它们是否与您的 MyFTable[[1]]
和 t[[1]]
元素匹配。要退出,请键入 Q
.