Р: Почему функции двух переменных не принимают векторы длины два в качестве входных данных? - PullRequest
1 голос
/ 26 апреля 2020

Из библиотеки gtools возьмите combinations(5,2). Это дает следующий вывод:

> combinations(5,2)
      [,1] [,2]
 [1,]    1    2
 [2,]    1    3
 [3,]    1    4
 [4,]    1    5
 [5,]    2    3
 [6,]    2    4
 [7,]    2    5
 [8,]    3    4
 [9,]    3    5
[10,]    4    5

Сохраняя это как comb, мы можем извлечь строки, например, comb[1,], что равно 1 2. Теперь предположим, что я хочу использовать comb[1,] в качестве входных данных для функции с двумя аргументами, скажем beta(a,b) (задокументировано здесь ). beta(1,2) работает просто отлично, но beta(comb[1,]) выдаст ошибку Error in beta(comb[1,]) : argument "b" is missing, with no default. Почему это? Я уверен, что это проблема типа, но R не является строго типизированным языком. Как можно избежать этой ошибки, если пользователь хочет использовать что-то вроде beta(comb[1,])?

1 Ответ

1 голос
/ 26 апреля 2020

Если нам нужно применить beta к выводу combinations, один из вариантов - преобразовать его в list, а затем использовать do.call

library(gtools)
do.call(beta, asplit(combinations(5,2), 2))
#[1] 0.500000000 0.333333333 0.250000000 0.200000000 0.083333333 
#[6] 0.050000000 0.033333333 0.016666667 0.009523810 0.003571429

Или другой вариант apply

apply(combinations(5, 2), 1, FUN = function(x) beta(x[1], x[2]))

это позволит избежать создания каких-либо объектов

- проверка вывода с отдельной записью beta

beta(1, 2) #1st row of combinations output
#[1] 0.5
beta(1, 3) # 2nd row of combinations output
#[1] 0.3333333
beta(1, 4) # 3rd row of combinations output
#[1] 0.25
...