A (менее элегантный) подход с базовыми функциями:
transform(shop.data,
profit = ifelse(is.na(profit),
ave(profit, hour, FUN = function(x) mean(x, na.rm = TRUE)),
profit))
# day hour profit
# 1 1 8 100
# 2 1 16 200
# 3 2 8 50
# 4 2 16 60
# 5 3 8 75
# 6 3 16 130
Область действия локальной переменной - это функция, в которой она определена. У компилятора нет проблем с проверкой того, что локальная переменная была инициализирована внутри функции, прежде чем она будет доступна в первый раз.
Что касается открытого класса, область видимости бесконечна, поэтому компилятор не может гарантировать, что поле будет инициализировано до того, как оно будет доступно. Чтобы не дать программе перейти в плохое состояние с помощью неинициализированной переменной, компилятор вызывает ошибку.
class A{
var abc : String // throws compile time error
fun myOwnedFun(){
var abcd : String // throws compile time error while accessing it
abcd. // throws error now, suggests you to initialize it.
}
}
Это потому, что Kotlin построен как нулевой безопасный язык, что означает, что все переменные должны быть инициализированы перед его использованием, либо как nullable, к которому следует добавить суффикс ?
и присвоить null
, либо по умолчанию конструктор для любых других классов, или используйте lateinit var
, если вы уверены, что будете назначать его где-то перед первым доступом к нему.
В Android Kotlin lateinit var
широко используется для глобальных переменных, которые будут назначаться в методах жизненного цикла, таких как onCreate()
и т. Д.,