Наличие ведущего NA
немного морщин, но я считаю очень читаемым (и векторизованным) способом LOCF, когда главный член not отсутствует:
na.omit(y)[cumsum(!is.na(y))]
В целом работает немного менее читаемая модификация:
c(NA, na.omit(y))[cumsum(!is.na(y))+1]
дает желаемый результат:
c(NA, 2, 2, 2, 2, 3, 3, 4, 4, 4)
Стандартная библиотека определяет пару функций для работы с инициализацией. Они являются общими, поэтому их можно использовать для инициализации значений любого типа.
Во-первых, есть std::mem::uninitialized()
, что дает вам неинициализированное значение. LLVM будет считать содержимое неопределенным и будет выполнять агрессивные оптимизации на основе этого. Вы должны инициализировать любое значение перед его чтением.
Во-вторых, есть std::mem::zeroed()
, который дает вам значение, чье хранилище заполнено нулями. Эта функция unsafe
, потому что такое значение не обязательно является законным для всех типов. zeroed()
подходит для типов «простых старых данных» (POD).
Как насчет использования mem::zeroed
? Документы ( https://doc.rust-lang.org/std/mem/fn.zeroed.html ) даже говорят:
Это полезно для FFI функции иногда, но обычно их следует избегать.
blockquote>