#julia #sapply
#julia #sapply
Вопрос:
Например, для каждого элемента вектора я хочу вычислить сумму остатков с другими элементами этого вектора. Это работает правильно для одного элемента:
a = [1, 2, 5, 7, 8, 22]
f(x) = sum(abs.(x .- a))
f(2)
Out: 35
Но если применить эту функцию ко всем элементам с помощью map(), Julia вернет ошибку:
map(a, f)
Out: "MethodError: no method matching iterate(::typeof(f))"
В R это очень легко получить с помощью sapply():
a = c(1, 2, 5, 7, 8, 22)
sapply(a, function(x) sum(abs(x - a)))
Out: 39 35 29 29 31 87
Есть ли столь же элегантный способ сделать это в Julia?
Комментарии:
1. Подводя итог приведенным ниже ответам: в Julia есть не менее элегантный способ сделать это, но и более элегантный способ 🙂
Ответ №1:
Просто векторизируйте f
:
julia> f.(a)
6-element Array{Int64,1}:
39
35
29
29
31
87
Ответ №2:
Функция map
принимает функцию, которую она применяет к коллекции, в качестве своего первого аргумента. Т.е. вы можете написать
map(f, a)
Ответ №3:
Обратите внимание, что для еще большего приближения к вашему синтаксису R map()
(и julia в целом) позволяет вам указывать анонимную функцию после вызова map, которая используется в качестве первого аргумента map, поэтому:
julia> map(a) do x
sum(abs.(x .- a))
end
6-element Array{Int64,1}:
39
35
29
29
31
87