2015-10-16 3 views
3

Кто-то прислал мне следующий код, который повторяет ту же команду (mvrnorm) 10 раз, в формате списка.Об использовании lapply

dat <- lapply(1:10,mvrnorm, n = 10, Sigma=matrix(.3, 3, 3), mu = rep(0, 3)) 

Код работает.

Однако, когда я пытаюсь выполнить следующую команду, она не работает, и я не понимаю, почему она не работает. Я ожидаю, что подсчитать количество столбцов в «х» в десять раз раз:

dat <- lapply(1:10, ncol, x=matrix(.3, 4, 4)) 

Error in FUN(X[[i]], ...) : unused argument (X[[i]]) 

В принципе, я пытаюсь понять, в какой ситуации работает в следующем формате:

lapply(1:10, function, ...) 

Если кто-нибудь может объяснить для меня, почему это работает, когда функция mvrnorm (первый пример), но не ncol (второй пример)?

+0

Я Сорта знаю, что кушетка говорит, но почему следующая работа? '1: 10' не передается' mvrnorm' в примере в моем исходном сообщении? 'dat <- lapply (1: 10, mvrnorm, n = 10, Sigma = matrix (.3, 3, 3), mu = rep (0, 3))' – Chet

+0

Мой вопрос в том, почему следующий формат работает для функция 'mvrnorm', но не' ncol'? 'lapply (1:10, function, ...)' – Chet

+0

Я не говорю, что вы ошибаетесь. Мой вопрос заключается в том, как заставить R 'подсчитывать количество столбцов в 'x' десять раз многократно и почему' dat <- lapply (1:10, ncol, x = matrix (.3, 4, 4)) ' не работает. (т. е. почему формат 'lapply (1:10, function, ...)' работает, когда функция 'mvrnorm', но не' ncol'?) – Chet

ответ

3

Basically, I am trying to understand in what situation the following format works:

lapply(1:10, fun, ...)

Во всех ситуациях, когда fun имеет более одного аргумента.

Давайте перевести lapply вызов эквивалентного for цикла:

X <- as.list(1:10) #elements to iterate over 
res <- vector(mode = "list", length = length(X)) #pre-allocate results list 
for (i in seq_along(X)) res[[i]] <- fun(X[[i]], ...) 

Теперь, если вы вызываете функцию одного аргумента с более чем одним аргументом, вы получите сообщение об ошибке говорит вам об этом. Вы также должны прочитать, как выполняется сопоставление аргументов в вызовах функций. В вашем примере lapply(1:10, ncol, x=matrix(.3, 4, 4)) вы выполняете смесь совпадений совпадений и позиционирования. Поскольку сопоставление имен имеет приоритет, аргумент x передается ncol, а затем элементы 1:10 используются в качестве второго аргумента. Вот почему ошибка говорит вам, что X[[i]] - неиспользуемый аргумент.

+0

Спасибо, как насчет 'lapply (1:10, print, x = 'test')'. После аргумента 'x' pass для 'print', используются ли элементы' 1: 10' в качестве второго аргумента для 'print'? Как работает этот аргумент? – Chet

+0

' print' получил '...' в качестве аргумента. Он принимает произвольное число аргументы. Итак, да, '1: 10' передается как второй аргумент и никогда не используется' print' . – Roland

+0

Очень ценим! – Chet

1

Как воспроизвести эту ошибку с наименьшим количеством линий, как это возможно в R:

test = function(){ #method takes no parameters 
    print("ok") 
} 
lapply(1:10, test)  #passing in 1 through 10 into test, 
         #error happens here 

Выдает ошибку:

Error in FUN(X[[i]], ...) : unused argument (X[[i]]) 
Calls: lapply -> FUN 
Execution halted 

Метод 'тест' не принимает никаких аргументов, и вы передали один аргумент ему с лапкой.

Как это исправить:

Убедитесь, что функция передается sapply принимает такое же количество аргументов, которые вы кормите его:

test = function(foobar){  #method takes one parameter 
    print("ok") 
} 
lapply(1:10, test)   #passing in 1 through 10 into test, 
          #this runs correctly, printing ok 10 times. 
Смежные вопросы