Как указать FUN, используемый в () или связанных с ним функциях apply () - PullRequest
4 голосов
/ 13 октября 2011

В функции by() я буду использовать cor (корреляция), чтобы быть там FUN. Однако я бы тоже хотел настроить use="complete.obs".

Я не знаю, как передать этот аргумент в FUN = cor части.

Например,

by(data, INDICES=list(data$Age), FUN=cor)

Ответы [ 4 ]

7 голосов
/ 13 октября 2011

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

Это на самом деле сам аргумент. Он будет собирать любые другие передаваемые вами аргументы и передавать их последующим функциям, вызываемым позже. Документация обычно говорит вам, какой функции будут переданы эти аргументы.

В этом случае, в ?by мы видим это:

...  further arguments to FUN.

Это означает, что любые другие аргументы, которые вы передаете by и которые не соответствуют перечисленным, будут переданы функции, которую вы передаете FUN.

Другой распространенный случай можно найти в plot, где в документации перечислены только два конкретных аргумента, x и y. Затем есть ..., который собирает все, что вы передаете в plot и передает его методам или par для установки настроек графических параметров.

Таким образом, в примере @ kohske, use = "complete.obs" будет автоматически передан cor, так как он не соответствует ни одному из других аргументов для by.

7 голосов
/ 13 октября 2011

наверное

by(data, INDICES=list(data$Age), FUN=cor, use = "complete.obs")

будет работать.

аргументы by передаются FUN.

2 голосов
/ 13 октября 2011

@ kohske и @joran дают эквивалентные ответы, показывающие встроенные функции by (которые также присутствуют в apply и всем семействе plyr) для передачи дополнительных аргументов в поставляемую функцию, поскольку это обычное приложение / проблема. @Tomas также показывает другой способ указать анонимную функцию, которая является просто функцией, которая вызывает «настоящую» функцию с фиксированными параметрами. Фиксация параметров в вызове функции (для эффективного создания функции с меньшим количеством аргументов) является распространенным подходом, особенно в функциональных подходах к программированию; в этом контексте это называется карри или частичное применение .

library("functional")
by(data, INDICES=list(data$Age), FUN=Curry(cor, use = "complete.obs"))

Этот подход можно использовать, когда одна функция не использует ... для «передачи» аргументов, и вы хотите указать единственную причину, по которой требуется анонимная функция, - это указать определенные аргументы.

1 голос
/ 13 октября 2011

В общем, у вас есть 2 возможности:

1) указывает аргументы в вызывающей функции (tapply() или by() в этом случае). Это также работает, даже если ключевой аргумент fun() не первый:

fun <- function(arg1, arg2, arg3) { ... } # just to see how fun() looks like
tapply(var1, var2, fun, arg1 = something, arg3 = something2) 
    # arg2 will be filled by tapply

2) вы можете написать свою функцию-обертку (иногда это необходимо):

* * 1010
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...