使用Return()

时间:2016-11-16 04:38:23

标签: r list function return

首先,我的英语不太正确,所以我提前为我的问题中的任何语法错误/错误道歉。

我有这个一般功能:

 .my_fun <- function(x,y,...){
      <body>
      return(
              list(
                    fun1 <- function(x){
                            <bodyfun1>
                         },
                    fun2 <- function(y){
                            <bodyfun2>
                         }, ....
                  )
            )
 }

用作辅助:

 .my_funfun <- .my_fun(x,y,...)

并使用“.my_funfun”作为代码启动器给出“my_fun”的参数

我必须返回给定顺序的值,当然还要返回列表正文中包含的函数的结果。通常,我会单独处理函数,将结果存储在单独的对象中,并将这些对象的值放在列表中,并返回该列表(最简单的方法),但我需要保留我之前显示的结构。

我的问题是:有没有办法解决列表正文中的函数并返回这些值,保持给定的结构?或者以这种方式使用回报是不可能的?我已经将return()用作过早的功能限制器,并将控制结构中的对象用作花式打印机,但这种用法对我来说是新的。

如果您需要特定的代码元素,我可以提供它们。

提前致谢。

2 个答案:

答案 0 :(得分:1)

请尝试添加可重现的示例,以便其他人帮助您。

无论如何,如果我正确地提出了你的问题。然后你就可以做到这一点。

my_fun <- function(x,y) {
    fun1 <- function(x) {
        length(x)
    }
    fun2 <- function(y) {
        sum(y)
    }
    list(fun1(x),fun2(y))
}

答案 1 :(得分:0)

好的,做些什么,我意识到我在代码上的错误是什么。事情是,当我打电话

myfun$fun1

我没有回答。制作清单的正确方法是

.my_fun <- function(x,y,...){
    <body>
    return(
        list(
            fun1 = function(x){
                    <bodyfun1>
                     },
            fun2 = function(y){
                    <bodyfun2>
                     }, ....
              )
        )
 }

所以我可以使用名称s&#34; fun1,fun2(...)作为名称来调用axiliary function.s。

示例:我想创建一个线性全等随机生成器,使用以下代码:

.rCongLin <- function(a, c, m, x0){
    v1 <- x0
    return(
            list(seed=function(xw){
                            v1 <- xw},
                    nxt=function(){
                            v2 <- ((a*v1)+c)%%m
                            v3 <- v2/m
                            v1<<-v2
                            return(v3)
                    },
                    shw=function(){
                            return(list(a=a,c=c,m=m,x0=x0))}
            )
    )
}

指示:

.rCL <- .rCongLin(51864,35186,4153,1515)

在给定函数的情况下启动数字生成:

rCL=function(n){
        replicate(n,.rCL$nxt())}
rCL(45)

其中seed()重新开始x0,nxt()计算数字,shw()显示内部状态(计算值)。 rCL(n)返回n个副本。

问题是.rCL$x()(其中x()是所提到的任何乐趣)如果您使用&#39;&lt; - &#39;操作员(改变它,所以你有一个我正在谈论的东西的演示),但它确实返回&#39; =&#39;。

答案是这些功能适用于&#39; =&#39;因为姓名是在&#39; =&#39;列表上分配的(您使用&#39; =&#39;列出名单中的内容,而不是&#39;&lt; - &#39;。因此,为了制作功能......&#34; citable&#34;在return(list(fun1, fun2...)的正文中,您需要使用&#39; =&#39;来指定名称fun1, fun2...

这是一个简单的答案。对使用&#39; =&#39;感到困惑和&#39;&lt; - &#39;因为在原始代码中,每个作业都是使用&#39; =&#39;来完成的。它容易混淆像我这样的小说程序员:(

非常感谢你的帮助! 我再次对这个答案中的任何重大错误感到抱歉。 我希望这能帮助更多人。