How to invisibly return a portion of a list

r, user-defined-functions

Solution

You could make an S3 print method

sky <- function(){
  structure(list(sun = 1, clouds = 4, birds =2, moon = 0), class="mysky")
}
print.mysky <- function(x, ...) print(x[1:2])

sky()
#$sun
#[1] 1
#
#$clouds
#[1] 4

You can see that that only affects how it is printed

str(sky())
#List of 4
# $ sun   : num 1
# $ clouds: num 4
# $ birds : num 2
# $ moon  : num 0
# - attr(*, "class")= chr "mysky"

names(sky())
#[1] "sun"    "clouds" "birds"  "moon"  

Here's another way to assign a class to an object

sky <- function(){
  out <- list(sun = 1, clouds = 4, birds =2, moon = 0)
  class(out) <- "mysky"
  out
}

`print.mysky` will be dispatched since the object's class is "mysky"

class(sky())
#[1] "mysky"

if you want to dispatch the default print method you can either call it directly (`print.default(sky())`), or `unclass` the object

#print.default(sky())
unclass(sky())

#$sun
#[1] 1
#
#$clouds
#[1] 4
#
#$birds
#[1] 2
#
#$moon
#[1] 0

Problem

I might be missing something very simple here. How do I create a user-defined function in R that returns a list where some elements are invisible? ``` sky <- function(){ list(sun = 1, clouds = 4, birds =2, moon = 0) } up <- sky() up #$sun #[1] 1 # #$clouds #[1] 4 # #$birds #[1] 2 # #$moon #[1] 0 ``` I would like `up` to print `up$sun` and `up$clouds` but not the other two elements. Yet, I still want `up` to be a list of all four elements: ``` names(up) #[1] "sun" "clouds" "birds" "moon" ```

Original source