创建一个R函数,存储可以调用但不显示的对象

时间:2015-01-07 04:11:05

标签: r

我是否可以创建一个R函数,输出不会显示内部的每个对象,但您可以使用$[]调用其中的对象,如下所示

abc <- function(a=1, b=2, c=3) {...}
#by default, abc() only the value of a will be shown but not b neither c

abc() 
[1] 1
abc()$a
[1] 1
abc()["b"]
[1] 2    
abc()$c
[1] 3   

感谢。

2 个答案:

答案 0 :(得分:5)

如果你想返回所有值,但只是默认显示某些值,我认为你最好的做法是给返回对象一个自定义类。一种策略是只列出一个列表并为该列表提供自定义打印方法。

print.myvalues <- function(x) {
    print(x$a)
}
abc <- function(a=1, b=2, c=3) {
    ret <- list(a=a, b=b,c=c)
    class(ret)<-"myvalues"
    ret
}
(x<-abc(10,20,30))
# [1] 10
x
# [1] 10
x$b
# [1] 20
x[["c"]]
# [1] 30

但是当用户以任何方式使用该号码时,这可能会使用户感到困惑,因为它不仅仅是一个数字

x+5
# Error in x + 5 : non-numeric argument to binary operator

稍微复杂一点的策略是将附加值存储为属性,并以这种方式重载$[方法

`$.myvalues` <- function(x, n) {
    x[n]
}
`[.myvalues` <- function(x, n) {
    if(n=="a") return(`attributes<-`(x,NULL))
    attr(x, n)
}
print.myvalues <- function(x) {
    attributes(x)<-NULL
    print(x)
}
abc <- function(a=1, b=2, c=3) {
    ret <- a
    attr(ret, "b") <- b
    attr(ret, "c") <- c
    class(ret)<-"myvalues"
    ret
}

并像

一样使用它
(x<-abc(10,20,30))
# [1] 10
x
# [1] 10
x$b
# [1] 20
x["c"]
# [1] 30
x+5
# [1] 15

此处我们保留了添加内容,当然bc值没有任何特别之处。如果我们想通过属性进行添加,我们也可以重载+运算符。这一切都取决于你想要的复杂程度。

答案 1 :(得分:1)

> abc <- function(a=1, b=2, c=3) { cat(a); invisible(list(a=a,b=b,c=c))}
> abc()
1
> abc()$c
1[1] 3
> abc()$a
1[1] 1
> abc <- function(a=1, b=2, c=3) { print(a); invisible(list(a=a,b=b,c=c))}
> abc()$a
[1] 1
[1] 1