For-l oop и Lapply: одна и та же функция дает разные результаты - PullRequest
1 голос
/ 10 января 2020

Я хочу перебрать функцию по списку векторов. Я пытаюсь использовать Lapply, однако это дает нежелательные результаты, в то время как a для l oop с теми же аргументами дает правильные результаты:

Воспроизводимый пример:

library(gtools) # for 'permutations' function
exampleList <- list(c("RETURN", "COMBINATIONS"), c(1,2,3), c("PLEASE WORK") )

Желаемый вывод ( что возвращает for-l oop):

for (i in 1:length(exampleList)) {
  print( permutations(n = length(exampleList[[i]]), r = length(exampleList[[i]]), v = exampleList[[i]]))
}

     [,1]           [,2]          
[1,] "COMBINATIONS" "RETURN"      
[2,] "RETURN"       "COMBINATIONS"
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    1    3    2
[3,]    2    1    3
[4,]    2    3    1
[5,]    3    1    2
[6,]    3    2    1
     [,1]         
[1,] "PLEASE WORK"

То, что в настоящее время возвращает версия Lapply:

lapply(exampleList, permutations, n = length(exampleList), r = length(exampleList))

Error in FUN(X[[i]], ...) : v is either non-atomic or too short

Если я правильно понимаю, lapply выполняет итерацию по каждому из exampleList [[i] ] поэтому аргумент 'v' указывать не нужно (обратите внимание, я все еще получаю сообщение об ошибке при попытке указать его). Что приводит к тому, что мои результаты противоречивы?

1 Ответ

1 голос
/ 10 января 2020

В вашей попытке вы даете значения n и r равными length(exampleList). Тем не менее, он должен быть равен длине каждого отдельного элемента в списке.

lapply(exampleList, function(x) 
        gtools::permutations(n = length(x), r = length(x), v = x))


#[[1]]
#     [,1]           [,2]          
#[1,] "COMBINATIONS" "RETURN"      
#[2,] "RETURN"       "COMBINATIONS"

#[[2]]
#     [,1] [,2] [,3]
#[1,]    1    2    3
#[2,]    1    3    2
#[3,]    2    1    3
#[4,]    2    3    1
#[5,]    3    1    2
#[6,]    3    2    1

#[[3]]
#     [,1]         
#[1,] "PLEASE WORK"

Вы также можете написать это с помощью Map

Map(function(x, y) gtools::permutations(n = y, r = y, v = x), 
                   exampleList, lengths(exampleList))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...