R почему do.call не соответствует прямому вычислению?

В процессе выполнения чего-то более сложного я обнаружил следующее: если я использую do.call для преобразования числового вектора в список, я получаю другое значение из применяемой функции, и я не уверен, почему.

x <- rnorm(30)
median(x) # -0.01192347

# does not match:
do.call("median",as.list(x))  # -1.912244

Почему?

Примечание: я пытаюсь запускать различные функции, используя вектор имен функций. Это работает с do.call, но только если я получаю правильный вывод от do.call.

Спасибо за любые предложения.


person cfosser    schedule 16.07.2018    source источник
comment
Я уверен, что кто-нибудь объяснит, почему, но do.call(median,list(x = x)) вернет ожидаемое значение.   -  person joran    schedule 16.07.2018
comment
Ах, конечно, as.list разбивает вектор на список отдельных элементов, и поэтому do.call() просто захватывает первый элемент для передачи median.   -  person joran    schedule 16.07.2018
comment
Спасибо! Это работает и немного объясняет, в чем проблема.   -  person cfosser    schedule 20.07.2018


Ответы (1)


Итак, do.call ожидает, что аргумент args будет списком аргументов, поэтому технически мы хотели бы передать list(x = x):

> set.seed(123)
> x <- rnorm(10)
> median(x)
[1] -0.07983455
> do.call(median,list(x = x))
[1] -0.07983455
> do.call(median,as.list(x))
[1] -0.5604756

Вызов as.list для вектора x превращает его в список длиной 10, как если бы вы собирались вызвать median и передать ему 10 отдельных аргументов. Но на самом деле мы проезжаем только один, x. В конце концов, он просто захватывает первый элемент вектора и передает его аргументу x.

person joran    schedule 16.07.2018
comment
Вы также можете узнать, почему вы не получаете сообщение об ошибке с версией as.list(x). Если я сделаю это: do.call(stats::median, as.list(x)) я получаю unused arguments ошибку. Похоже, вы используете другое определение median, которое делает что-то еще с этими 29 другими аргументами, и это различие может вызвать у вас дополнительные ошибки позже. - person Chris; 16.07.2018
comment
@Chris Интересно, я не получаю ошибку неиспользованного аргумента. Я подозреваю, что ... проглатывает лишние значения. - person joran; 16.07.2018
comment
Ах, да ладно, это было из-за ошибок в волосах, вероятно, просто из-за разницы в версиях. - person Chris; 16.07.2018
comment
Спасибо за объяснение. :-) - person cfosser; 20.07.2018