Преимущества super()
в одиночном наследовании минимальны - в основном вам не нужно жестко закодировать имя базового класса во все методы, которые используют его родительские методы.
Однако использовать множественное наследование практически невозможно super()
. Это включает в себя общие идиомы, такие как mixins, интерфейсы, абстрактные классы и т. Д. Это распространяется на код, который позже расширяет ваши. Если кто-то позже захотел написать класс, который расширил Child
и mixin, их код не будет работать должным образом.
Возможно, вы хотите ifelse
:
a <- c(1,1,1,1,0,0,0,0,2,2)
ifelse(a>0,a/sum(a),1)
[1] 0.125 0.125 0.125 0.125 1.000 1.000 1.000 1.000
[9] 0.250 0.250
Просто добавив точку в целом дискуссию о том, почему это предупреждение появляется (раньше мне это не было ясно). Причина, по которой это делается, как упоминалось ранее, заключается в том, что «a» в этом случае является вектором, а неравенство «a> 0» создает другой вектор TRUE и FALSE (где «a» -> 0 или нет).
Если вы хотите вместо этого проверить, есть ли какое-либо значение 'a> 0', вы можете использовать функции - «any» или «all»
Best
if
оператор не векторизован. Для векторизованных операторов if вы должны использовать ifelse
. В вашем случае достаточно написать
w <- function(a){
if (any(a>0)){
a/sum(a)
}
else 1
}
или короткую векторную версию
ifelse(a > 0, a/sum(a), 1)
. Это зависит от того, что вы хотите использовать, потому что первая функция дает выходной вектор длина 1 (в остальной части) и ifelse
дает выходной вектор длины, равный длине a
.
Как я решал этот вопрос, когда я пытался сделать что-то подобное, когда я определял функцию, и он вызывался с массивом, как другие указывали
. Вы могли бы сделать что-то вроде этого, однако для эти сценарии менее элегантны по сравнению с методом Свена.
sapply(a, function(x) afunc(x))
afunc<-function(a){
if (a>0){
a/sum(a)
}
else 1
}
Вот простой способ без ifelse
:
(a/sum(a))^(a>0)
Пример:
a <- c(0, 1, 0, 0, 1, 1, 0, 1)
(a/sum(a))^(a>0)
[1] 1.00 0.25 1.00 1.00 0.25 0.25 1.00 0.25
ifelse
примерно в 7 раз (на массиве элементов 100000).
– Matthew Lundberg
5 January 2013 в 16:24
^
(например, то, что он назвал и как он работает). Предпочтительно что-то более прямое, чем документация арифметических операторов ...
– theforestecologist
13 November 2017 в 03:35
^
используется для возведения в степень. Команда x ^ y
означает: x
поднята до значения y
. Код 2 ^ 3
будет вычислять 2 * 2 * 2
.
– Sven Hohenstein
13 November 2017 в 21:19