Interpretación de la advertencia “condición tiene longitud> 1” desde la función `if`

Tengo una matriz:

a <- c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) 

y me gustaría implementar la siguiente función:

 w0){ a/sum(a) } else 1 } 

Esta función quiere comprobar si hay algún valor en a valor mayor que 0 y, en caso afirmativo, dividir cada elemento entre la sum del total.

De lo contrario, debería simplemente registrar 1.

Recibo el siguiente mensaje de advertencia:

  Warning message: In if (a > 0) { : the condition has length > 1 and only the first element will be used 

¿Cómo puedo corregir la función?

tal vez quieras 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 

if sentencia no está vectorizada. Para las declaraciones vectorizadas if, debe usar ifelse . En tu caso, es suficiente escribir

 w <- function(a){ if (any(a>0)){ a/sum(a) } else 1 } 

o una versión corta vectorizada

 ifelse(a > 0, a/sum(a), 1) 

Depende de qué dispositivo desee utilizar, ya que la primera función proporciona un vector de salida de longitud 1 (en la parte else) y ifelse da un vector de salida de longitud igual a la longitud de a .

Aquí hay una manera fácil sin ifelse :

 (a/sum(a))^(a>0) 

Un ejemplo:

 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 

Solo agregué un punto a toda la discusión sobre por qué surge esta advertencia (antes no me resultaba claro). La razón por la que uno obtiene esto es como se mencionó anteriormente es porque ‘a’ en este caso es un vector y la desigualdad ‘a> 0’ produce otro vector de VERDADERO y FALSO (donde ‘a’ es> 0 o no).

Si en su lugar desea probar si hay algún valor de ‘a> 0’, puede usar funciones – ‘any’ o ‘all’

Mejor

La forma en que atravesé esta pregunta fue cuando intenté hacer algo similar cuando estaba definiendo una función y se llamaba con la matriz como otros señalaron

Podrías hacer algo como esto, pero para estos escenarios es menos elegante en comparación con el método de Sven.

 sapply(a, function(x) afunc(x)) afunc<-function(a){ if (a>0){ a/sum(a) } else 1 }