Вот трюк. Позволяет открыть REPL и определить класс:
scala> case class Foo(i: Int)
defined class Foo
и простую функцию, которая работает с этим классом:
scala> def fooToInt(foo: Foo) = foo.i
fooToInt: (foo: Foo)Int
переопределить класс:
scala> case class Foo(i: Int)
defined class Foo
и создать экземпляр:
scala> val foo = Foo(1)
foo: Foo = Foo(1)
Все, что осталось, - вызвать fooToInt
:
scala> fooToInt(foo)
<console>:34: error: type mismatch;
found : Foo(in class $iwC)(in class $iwC)(in class $iwC)(in class $iwC)
required: Foo(in class $iwC)(in class $iwC)(in class $iwC)(in class $iwC)
fooToInt(foo)
Он выглядит знакомым? Еще один трюк, чтобы лучше понять, что происходит:
scala> case class Foo(i: Int)
defined class Foo
scala> val foo = Foo(1)
foo: Foo = Foo(1)
scala> case class Foo(i: Int)
defined class Foo
scala> def fooToInt(foo: Foo) = foo.i
<console>:31: error: reference to Foo is ambiguous;
it is imported twice in the same scope by
import INSTANCE.Foo
and import INSTANCE.Foo
def fooToInt(foo: Foo) = foo.i
. Короче говоря, это ожидаемое, хотя и слегка запутанное поведение, которое возникает из неоднозначных определений, существующих в той же области.
Если вы не хотите периодически :reset
REPL state, вы должны отслеживать созданные вами сущности и, если изменения типов определений, убедитесь, что неопределенные определения не сохраняются (переписывайте вещи, если необходимо), прежде чем продолжить.
Я бы попробовал:
df <- df %>%
filter(!is.na(x)) %>%
mutate(x= if_else(x< lag(x), lag(x), x))
Надеюсь, что это работает для вас!