mariotomo - 5 months ago 29

R Question

Still trying to get into the R logic... what is the "best" way to unpack (on LHS) the results from a function returning multiple values?

I can't do this apparently:

`R> functionReturningTwoValues <- function() { return(c(1, 2)) }`

R> functionReturningTwoValues()

[1] 1 2

R> a, b <- functionReturningTwoValues()

Error: unexpected ',' in "a,"

R> c(a, b) <- functionReturningTwoValues()

Error in c(a, b) <- functionReturningTwoValues() : object 'a' not found

must I really do the following?

`R> r <- functionReturningTwoValues()`

R> a <- r[1]; b <- r[2]

or would the R programmer write something more like this:

`R> functionReturningTwoValues <- function() {return(list(first=1, second=2))}`

R> r <- functionReturningTwoValues()

R> r$first

[1] 1

R> r$second

[1] 2

--- edited to answer Shane's questions ---

I don't really need giving names to the result value parts. I am applying one aggregate function to the first component and an other to the second component (

`min`

`max`

Answer

**(1) list[...]<-** I had posted this over a decade ago on r-help. It does not require a special operator but does require that the left hand side be written using `list[...]`

like this:

```
# first run source command shown below or else install and load gsubfn dev pkg (see Note)
list[a, b] <- functionReturningTwoValues()
```

Note:Recently`list`

has been added to the development version of the gsubfn package and can be sourced via the following:`source("https://raw.githubusercontent.com/ggrothendieck/gsubfn/master/R/list.R")`

or install and load gsubfn github development package (using devtools package):

`devtools::install_github("ggrothendieck/gsubfn") library(gsubfn)`

If you only need the first or second component these all work too:

```
list[a] <- functionReturningTwoValues()
list[a, ] <- functionReturningTwoValues()
list[, b] <- functionReturningTwoValues()
```

(Of course, if you only needed one value then `functionReturningTwoValues()[[1]]`

or `functionReturningTwoValues()[[2]]`

would be sufficient.)

See the cited r-help thread for more examples.

**(2) with** If the intent is merely to combine the multiple values subsequently and the return values are named then a simple alternative is to use `with`

:

```
myfun <- function() list(a = 1, b = 2)
list[a, b] <- myfun()
a + b
# same
with(myfun(), a + b)
```

**(3) attach** Another alternative is attach:

```
attach(myfun())
a + b
```

ADDED: `with`

and `attach`