如何无形地返回列表的一部分

sdg*_*238 6 r user-defined-functions

我可能会遗漏一些非常简单的东西.

如何在R中创建用户定义的函数,返回一个列表,其中某些元素是不可见的?

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
Run Code Online (Sandbox Code Playgroud)

我想up打印up$sunup$clouds而不是其他的两个元素.然而,我仍然希望up成为所有四个要素的清单:

names(up)
#[1] "sun"    "clouds" "birds"  "moon"
Run Code Online (Sandbox Code Playgroud)

GSe*_*See 5

你可以制作一个S3打印方法

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
Run Code Online (Sandbox Code Playgroud)

您可以看到它只影响它的打印方式

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"  
Run Code Online (Sandbox Code Playgroud)

这是将类分配给对象的另一种方法

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

print.mysky 将被派遣,因为对象的类是"mysky"

class(sky())
#[1] "mysky"
Run Code Online (Sandbox Code Playgroud)

如果要调度默认打印方法,可以直接调用它(print.default(sky()))或unclass对象

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

#$sun
#[1] 1
#
#$clouds
#[1] 4
#
#$birds
#[1] 2
#
#$moon
#[1] 0
Run Code Online (Sandbox Code Playgroud)