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

pe-*_*rry 1 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   
Run Code Online (Sandbox Code Playgroud)

谢谢.

MrF*_*ick 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
Run Code Online (Sandbox Code Playgroud)

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

x+5
# Error in x + 5 : non-numeric argument to binary operator
Run Code Online (Sandbox Code Playgroud)

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

`$.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
}
Run Code Online (Sandbox Code Playgroud)

并使用它

(x<-abc(10,20,30))
# [1] 10
x
# [1] 10
x$b
# [1] 20
x["c"]
# [1] 30
x+5
# [1] 15
Run Code Online (Sandbox Code Playgroud)

在这里,我们保留了添加,当然没有任何特别的事情发生在bc值.+如果我们想通过属性进行添加,我们也可以重载运算符.这一切都取决于你想要的复杂程度.