我是否可以创建一个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
感谢。
答案 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
此处我们保留了添加内容,当然b
和c
值没有任何特别之处。如果我们想通过属性进行添加,我们也可以重载+
运算符。这一切都取决于你想要的复杂程度。
答案 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