Рассмотрим следующий пример:Как функции, которые одновременно работают над векторами и их элементами, работают в R?
boltzmann <- function(x, t=0.1) { exp(x/t)/sum(exp(x/t)) }
z=rnorm(10,mean=1,sd=0.5)
exp(z[1]/t)/sum(exp(z/t))
[1] 0.0006599707
boltzmann(z)[1]
[1] 0.0006599707
Оказывается, что exp
в функции boltzmann
работает над элементами и векторами и знает, когда делать правильные вещи. Является ли sum
«разворачиванием» входного вектора и применением выражения для значений? Может кто-нибудь объяснить, как это работает в R?
Редактировать: Спасибо за все комментарии, разъяснения и терпение с помощью R n00b. Таким образом, причина, по которой это работает, не была сразу очевидна для меня, исходя из других языков. Возьмем, например, python. Сначала вы вычислили сумму, а затем вычислили значение для каждого элемента в векторе.
denom = sum([exp(v/t) for v in x])
vals = [exp(v/t)/denom for v in x]
В то время как это R sum(exp(x/t))
может быть вычислена в линию.
Я не совсем понимаю этот вопрос, в основном, потому что я не уверен, что вы ожидали. (Кстати, обратите внимание на то, что в R не существует такой вещи, как «элемент», число - это просто вектор длины 1. Например, попробуйте «x = 2; print (x [1]); print (x [ 1] [1]) '). –
@DavidRobinson Извините, я новичок в R. Другой способ описать это - то, что в числителе x обрабатывается элементом по элементу и в знаменателе, он агрегируется для получения суммы. Как так? – drsnyder