Как назвать список элементов непосредственно из аргумента функции, используя apply - PullRequest
0 голосов
/ 02 июня 2018

У меня есть функция с тремя аргументами, каждый в виде списка.Значения этих аргументов не являются фиксированными.Они являются выходами другой функции, применяемой к различным наборам данных.Я хотел бы передать имя для каждого выхода.Моя оригинальная функция возвращает конкретные результаты каждого набора данных.Затем по результатам я могу узнать, какая модель лучше для меня.Таким образом, простой способ сделать это - напечатать все результаты с названием модели.Я могу сделать это вручную, но это отнимает много времени и иногда заставляет меня ошибиться.Поэтому я попытался написать функцию, облегчающую эту задачу.

Я думаю об использовании функции 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

Ожидаемый результат:

Я хотел бы получить что-то вродеthis:

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

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

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

Очень важно: в этом примере каждый список содержит только 3 элемента.Однако иногда мне нужно работать с произвольным числом (не фиксированным числом) элементов, скажем, 8 или 10.Итак, я хотел бы использовать lapply, чтобы сделать это для меня автоматически внутри моей функции.

1 Ответ

0 голосов
/ 02 июня 2018

Может быть, что-то вроде следующего будет делать то, что вы хотите.

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)
...