如何使用 apply 直接从函数的参数中命名元素列表

How to name a list of elements directly from the argument of the function using apply

我有一个包含三个参数的函数,每个参数都是一个列表。这些参数的值不是固定的。它们是应用于不同数据集的另一个函数的输出。我想为每个输出传递一个名称。我的原始函数 returns 每个数据集的特定结果。然后,从结果中,我可以知道什么是最适合我的模型。因此,最简单的方法是使用模型名称打印所有结果。我可以手动执行此操作,但这非常耗时,有时还会导致我犯错误。因此,我尝试编写一个函数来简化此任务。

我正在考虑使用paste功能,但不知道正确的方法。

由于我的函数又长又难,我提供一个简单的例子。

myfun <- function(x){
    out <- list()
    out$x1 <- x^2
    out$x2 <- x^3
    out$x3 <- x^2+1
    return(out)
}

y1 <- 4
y2 <- 5
y3 <- 6


res1 <- myfun(y1)
res2 <- myfun(y2)
res3 <- myfun(y3)

myfun2 <- function(out1=list(), out2=list(), out3=list()){
    m <- length(out1)
    outfin <- lapply(1:m, function(i) c(out1[[i]], out2[[i]], out3[[i]]))
    return(outfin)
}
out1 <- list(res1$x1, res2$x1, res3$x1)
out2 <- list(res1$x2, res2$x2, res3$x2)
out3 <- list(res1$x3, res2$x3, res3$x3)

res.fin <- myfun2(out1, out2, out3)

那我会得到这个:

> res.fin
[[1]]
[1] 16 64 17

[[2]]
[1]  25 125  26

[[3]]
[1]  36 216  37

预期输出:

我想要这样的东西:

[[1]]
[1]"x1:" 16 64 17

[[2]]
[1]"x2:" 25 125  26

[[3]]
[1] "x3:" 36 216  37

非常重要:在这个例子中,每个列表只有 3 个元素。但是,有时,我需要处理任意数量(非固定数量)的元素,例如 810。所以,我想使用 lapply 在我的函数中自动为我做这件事。

也许像下面这样的东西会做你想要的。

myfun2 <- function(out1=list(), out2=list(), out3=list()){
    m <- length(out1)
    outfin <- lapply(1:m, function(i) c(out1[[i]], out2[[i]], out3[[i]]))
    setNames(outfin, paste0("x", seq_along(outfin)))
}

res_list <- lapply(ls(pattern = "^res\d+$"), get)

out1b <- unlist(lapply(res_list, `[`, 1), recursive = FALSE)
out2b <- unlist(lapply(res_list, `[`, 2), recursive = FALSE)
out3b <- unlist(lapply(res_list, `[`, 3), recursive = FALSE)

res.finb <- myfun2(out1b, out2b, out3b)