在R中隐藏函数的结果

时间:2016-05-23 16:36:32

标签: r

我创建了一个具有四个输出参数的函数,例如:

myfuction<-function(...){     
    #Inside the function I created four results A, B, C, and D.    
    A = ...    
    B = ...    
    C = ...    
    D = ...     
    z<-list(MacKinnon=A,regression=B,proof=C, res=D)    
    return(z)
}

结果D对应于一个数字向量,表示回归的残差。

我的问题是如何在不删除结果的情况下隐藏此结果?也就是说,我希望当我运行该函数时,会出现结果A,B和C,但不会出现结果D.

如果我想访问结果D,我必须做这样的事情:

X <-myfuction (...)
X$res

能够观察残留物。

2 个答案:

答案 0 :(得分:9)

我只会使用S3类。基本上,只需使用特定类

标记对象z
myfunction <- function(){     
  #Inside the function I created four results A, B, C, and D.    
  A = 10;B = 20;C = 30; D = 40     
  z = list(MacKinnon=A, regression=B, proof=C, res=D)    
  class(z) = "my_fun" # Tagging here
  return(z)
}

my_fun

创建S3打印功能
print.my_fun = function(x, ...) print(x[1:3])

然后

R> x = myfunction()
R> x
$MacKinnon
[1] 10

$regression
[1] 20

$proof
[1] 30

但是

R> x$res
[1] 40

给你想要的。

一些意见/指示。

  • 通常在分配课程时,您会使用类似

    的内容
    class(z) = c("my_fun", class(z))
    

    但是,由于我们刚刚在上面的行中创建了z,因此不需要这样做。

  • 目前print方法剥离了任何其他类(在示例中,只有一个类,所以这不是问题)。如果我们想要维护多个类,我们将使用

    print.my_fun = function(x, ...) {
      x = structure(x[1:3], class = class(x)) 
      NextMethod("print")
    }
    

    函数的第一行子集x,但维护所有其他类。第二行,然后将x传递给下一个print.class_name函数。

答案 1 :(得分:0)

您可以使用invisible

例如,这不会向控制台打印任何内容,但允许您分配输出:

myfunction<-function(){
    #Inside the function I created four results A, B, C, and D.
    A = 1; B = 2; C = 3; D = 4
    z<-list(MacKinnon=A,regression=B,proof=C, res=D)
    return(invisible(z))
}

myfunction()       # nothing prints
x <- myfunction()
x                  # now it does!
# $MacKinnon
# [1] 1

# $regression
# [1] 2

# $proof
# [1] 3

# $res
# [1] 4

如果您希望在控制台上打印特定部件,可以使用printcat

myfunction<-function(){
    #Inside the function I created four results A, B, C, and D.
    A = 1;    B = 2;    C = 3;    D = 4
    z<-list(MacKinnon=A,regression=B,proof=C, res=D)
    print(A)
    return(invisible(z))
}

myfunction()
# [1] 1

如果您不希望在未分配函数的情况下运行输出,则此功能非常有用。如果您不希望在将其分配给变量后进行打印,则应创建一个{@ 1}}方法,如@csgillespie建议。