как лакировать фильтр - PullRequest
0 голосов
/ 01 марта 2019

Я использую Filter () для удаления столбцов NA из фреймов данных.

Filter(function(x) !all(is.na(x)), df)

У меня есть список фреймов данных со столбцами NA, для которых я хотел бы запустить эту функцию.Я не понимаю, как передать эти аргументы в Filter () при запуске его в lapply ().Просто документация просто говорит «...».

Мое лучшее предположение:

> lapply(mylist, Filter, function(x) !all(is.na(x)))
Error in get(as.character(FUN), mode = "function", envir = envir) :
  object 'f' of mode 'function' was not found

Какой правильный способ сделать это?

1 Ответ

0 голосов
/ 01 марта 2019

Это работает, если вы называете аргументы явно:

lapply(mylist, Filter, f = function(x) !all(is.na(x)) )

Где бы я узнал о таких деталях, как необходимость присвоения имени функции?Почему мне нужно называть функцию, когда она используется в качестве аргумента lapply (), а не в качестве аргумента для Filter ()?

Сравнение аргументов помогает:

> args(Filter)
function (f, x) 
> args(lapply)
function (X, FUN, ...) 

Читая ?lapply, мы видим, что lapply(X, FUN, ...) создает вызовы наподобие FUN(X[[i]], ...).Однако в Filter(f, x), x не в первой позиции, поэтому мы должны назвать все аргументы, которые предшествуют этому.Когда мы делаем это, lapply знает, как построить

Filter(mylist[[i]], f = function(x) !all(is.na(x)) )

, что эквивалентно

Filter(function(x) !all(is.na(x)), mylist[[i]])

Для получения подробных сведений о том, как считываются аргументы, часть «Именованные аргументы и значения по умолчанию»документы могут быть полезны, в RShowDoc("R-intro", type = "html").

...