S3 Methods
This is probably a crucial example as it demonstrates one great way to use Vapour. R's S3 dispatch methods are very common in R and in fact somewhat resembles the idea of "types:" dispatching methods based on an object class.
Assume we're working with a simple database, we need to fetch users from the
database, update the users table, etc (CRUD).
We should probably define a user object
that would allow us to ensure
we always work with the right structure, and expected types.
Here we assume this is created within an R package.
We define a user
type.
type user: object {
id: int,
name: char
}
Now we can define a function that will create a user
.
func create_user(): user {
return user()
}
Now we can define our methods on the user
object, we'll define
two methods to update the id
and the name
of a user.
Set ID
- Vapour
- R
@generic
func (x: any) set_id(id: int, ...: any): any
#' @export
func (x: user) set_id(id: int, ...: any): user {
stopifnot(!missing(id))
x$id = id
return x
}
set_id <- function(x, id, ...) {
UseMethod("set_id")
}
set_id.user <- function(x, id, ...) {
stopifnot(!missing(id))
x$id <- id
return(x)
}
Set name
- Vapour
- R
@generic
func (x: any) set_name(name: char, ...: any): any
#' @export
func (x: user) set_name(name: char, ...: any): user {
stopifnot(!missing(name))
x$name = name
return x
}
set_name <- function(x, id, ...) {
UseMethod("set_name")
}
set_name.user <- function(x, id, ...) {
stopifnot(!missing(id))
x$id <- id
return(x)
}
With the methods created we can now used them!
- Vapour
- R
let john: user = create_user() |>
set_id(1) |>
set_name("John")
john = create_user() |>
set_id(1) |>
set_name("John")
Finally, you can transpile the code.
vapour -indir=vp