【问题标题】:How to pass the output of a function to another function in R?如何将函数的输出传递给R中的另一个函数?
【发布时间】:2021-12-26 05:17:23
【问题描述】:

所以我想将 func1 的输出传递给 func2。

func1 <- function(x, y, z) {
    k = x*2
    j = y*2
    i = z*2
}

func2 <- function(x, y, z) {
    func1(x, y, z)
    m = k * j * i
    return (m)
}

它不断打印错误。

【问题讨论】:

  • 您的 func1 没有返回任何内容。您的 func2 不需要 return(),只需要 m。

标签: r user-defined-functions


【解决方案1】:

这是另一种解决方案。这称为function factory,表示创建另一个函数的函数。由于func2只使用func1的输出,它可以通过lexical scoping在其父环境中找到它们,也就是func1的执行环境。 请注意我为了调用函数而使用的额外的一对括号,因为第一个函数的输出是一个函数。

func1 <- function(x, y, z) {
  k <- x * 2
  j <- y * 2
  i <- z * 2
  func2 <- function() {
    m <- k * j * i
    m
  }
}

func1(1, 2, 3)()
[1] 48

有关更多信息,您可以阅读 Hadley Wickham 的 Advanced R 的 section

【讨论】:

    【解决方案2】:

    这里发生了很多事情,这在一定程度上取决于您是否向我们展示了一个非常简化的版本。例如,您是否真的在第一个函数中对 x、y、z 做同样​​的事情,还是可能做不同的事情?

    首先,您在 func1() 中创建的 ijk 向量不存在于 func1() 之外。 正如@akrun 所说,您可以纠正这个问题,让它们成为一个向量(如果它们始终属于同一类型)或一个列表,然后返回它。

    那么你可以得到,比如说,

    func1 <- function(x, y, z) {
        k <- x*2
        j <- y*2
        i <- z*2
        c(k, j, i)
    }
    
    

    此时您可以为第二个函数添加一个参数。

    func2 <- function(x, y, z) {
       ijk <- func1(x, y, z)
       prod(ijk)
      
    }
    
    

    如果你可以矢量化 func1() 当然更容易(但我不知道你简化了多少)。

    func1v2 <- function(x, y, z) {
       
        2* c(k, j, i)
    }
    
    

    【讨论】:

      【解决方案3】:

      由于func2 仅生成向量的乘积,因此您无需定义第二个函数。你可以这样做:首先像你一样定义func1

      func1 <- function(x, y, z) {
          k = x*2
          j = y*2
          i = z*2
      return(c(k,j,i))
      }
      

      然后像这样在prod函数中使用它

      prod(func1(1, 2, 3))
      48
      

      【讨论】:

        【解决方案4】:

        我们可以从第一个函数返回一个名为list,然后使用with访问第一个函数输出的names

        func1 <- function(x, y, z) {
            list(k = x*2,
            j = y*2,
            i = z*2)
            
        }
        func2 <- function(x, y, z) {
             with(func1(x, y, z), k * j * i)
          
            
        }
        

        -测试

        
        func2(3, 5, 6)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-08-19
          • 1970-01-01
          • 2017-01-14
          • 2021-08-02
          • 1970-01-01
          • 2021-02-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多