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$sun和up$clouds而不是其他的两个元素.然而,我仍然希望up成为所有四个要素的清单:
names(up)
#[1] "sun" "clouds" "birds" "moon"
Run Code Online (Sandbox Code Playgroud)
你可以制作一个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)