Important: unpackr overwrites some of base R's assignment operators and can significantly slow down some code, depending on the circumstances. If speed is most important to you and you are fine ditching the Python analogy and looks, try the zeallot package.
devtools::install_github("burchill/unpackr")
In Python 3, you can unpack values for assignment in a single line of code, like
a, b, c = "A", True, [1,2,3]
which will set a
, b
, and c
to "A"
, True
, and [1,2,3]
, respectively. You can even add the *
operator to make variables take zero through infinite values. For
a, *b, c = [1,2,3,4,5,6,7,8,9]
b
is assigned the numbers 2-8, while a
is 1
and c
is 9
.
R does not have this feature built-in (and cannot exactly replicate it), but the unpackr package aims to provide a close analogue for R users.
With unpackr you can recreate the first Python example like so:
library(unpackr)
a %,% b %,% c <- "A" %,% TRUE %,% 1:3
a
#>[1] "A"
b
#>[1] TRUE
c
#>[1] 1 2 3
And the second one like:
a %,*% b %,% c = 1:9
a
#>[1] 1
b
#>[1] 2 3 4 5 6 7 8
c
#>[1] 9
While Python assigns an empty list to starred variables that are assigned none of the input (below b
is assigned []
),
a, *b, c = [1,2]
in unpackr, b
is assigned NULL
:
a %,*% b %,% c = c(1, 2)
Additionally, unpackr lets you assign variables with =
and <<-
. =
behaves just like <-
, but <<-
behaves as if you were using base R's <<-
on each variable separately, so if a
and b
are found in different parent environments, they will be assigned their new values in their respective environments.
a <- "original"
f <- function() {
b <- "inside_original"
function() {
a %,% b <<- 1 %,% 2
}
}
g <- f()
g()
a
#>[1] 1
b
#> Error: object 'b' not found
get("b", environment(g))
#>[1] 2