Интерпретация “имеет длину> 1” предупреждение от функции `if`

У меня есть массив:

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) 

и хотел бы реализовать следующую функцию:

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

Эта функция хотела бы проверить, существует ли какое-либо значение больше, чем 0, и если да, то разделите каждый элемент на сумму суммы.

В противном случае он должен просто записать 1.

Появляется следующее предупреждающее сообщение:

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

Как я могу исправить функцию?

5 Solutions collect form web for “Интерпретация “имеет длину> 1” предупреждение от функции `if`”

возможно, вы хотите 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 оператор не векторизован. Для векторизованных операторов if вы должны использовать ifelse . В вашем случае достаточно написать

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

или короткой векторной версии

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

Это зависит от того, что вы хотите использовать, потому что первая функция дает выходной вектор длины 1 (в другой части), а ifelse дает выходной вектор длины, равный длине a .

Вот простой способ без 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 

Просто добавив точку в целом дискуссию о том, почему это предупреждение появляется (мне было непонятно раньше). Причина, по которой это делается, как упоминалось ранее, заключается в том, что «a» в этом случае является вектором, а неравенство «a> 0» создает другой вектор TRUE и FALSE (где «a» -> 0 или нет).

Если вы хотите вместо этого проверить, имеет ли значение «a> 0», вы можете использовать функции «any» или «all»,

Лучший

То, как я рассматриваю этот вопрос, было, когда я пытался сделать что-то подобное, когда я определял функцию, и ее вызывали с массивом, как и другие, указывали

Вы могли бы сделать что-то подобное, но для этих сценариев это менее элегантно по сравнению с методом Свена.

 sapply(a, function(x) afunc(x)) afunc< -function(a){ if (a>0){ a/sum(a) } else 1 } 
  • R: Маскированные функции
  • Добавить столбец «ранг» в кадр данных
  • Как сортировать буквы в строке?
  • Найти ближайшее значение в векторе с бинарным поиском
  • Определить все объекты данного classа для дальнейшей обработки
  • В R, как получить имя объекта после его отправки в функцию?
  • Для каждой строки возвращаем имя столбца наибольшего значения
  • Выбор только числовых столбцов из кадра данных
  • Возьмите сумму переменной, если комбинация значений в двух других столбцах уникальна
  • Увеличение на 1 для каждого изменения в столбце
  • Проверить наличие директории и создать, если не существует
  • Interesting Posts

    Почему Hibernate query.list () медленный?

    Невозможно написать файл кеша jarlist при создании проекта Android

    Нет звука в Windows 7

    В чем разница между Thread start () и Runnable run ()

    Изменение цвета фона для выбранного элемента ListBox

    Есть ли способ разрешить стандартным пользователям перезапуск (остановка / запуск) диспетчера очереди печати?

    Создание продукта SDK: как добавить собственный lib (.so) и банку с SDK, который я создаю?

    Как узнать R как язык программирования?

    USB не загружается при попытке установить Linux на моем Asus EeeBook X205TA

    Нужна помощь по формуле, чтобы оставить ячейку пустой

    Вставить автоматический прирост первичного ключа в существующую таблицу

    В чем разница между @ViewChild и @ContentChild?

    Можно ли настроить статическую IP-альтернативу для всех адаптеров с помощью реестра?

    OnItemClickListener и OnClickListener не работают в ListView

    Возврат сервиса WCF «Метод не разрешен»

    Давайте будем гением компьютера.