【问题标题】:How to store different outputs inside a funcion? [duplicate]如何在函数中存储不同的输出? [复制]
【发布时间】:2020-05-21 13:09:33
【问题描述】:

我想存储在函数内部计算的不同输出变量。 我编写了一个玩具示例:

f = function(number) 
{

  xx = NULL
  savexx = NULL
  savexx10 = NULL
  for (i in 1:10) {
  x = number*i
  xx = c(xx,x)
  }

  save_phrase = "hello"
  savexx = xx        
  savexx10 = xx*10
  save = cbind(savexx,savexx10)

}

store = f(1)
store

但使用此代码,它只返回变量save = cbind(savexx,savexx10)。 我想保存在这个函数中创建的所有 4 个变量。

是否可以在不使用数据框或列表的情况下执行此操作?

【问题讨论】:

  • 不可能。您可以尝试将其保存到全局环境中,但我认为这不是一个好的解决方案。使用list 有什么问题?
  • 玛塔你的回答非常好。列表没有错,只是想知道是否有可能这样做,似乎没有。如果可以,请发布您的答案

标签: r function


【解决方案1】:

没有list 是不可能的。 List 会比 data.frame 更好,因为它可以存储不同类型的变量(vectortableplot 等)尝试像这里那样做:

f = function(number) 
{

xx = NULL
savexx = NULL
savexx10 = NULL
for (i in 1:10) {
  x = number*i
  xx = c(xx,x)
}

lista <- list()

lista$save_phrase = "hello"
lista$savexx = xx        
lista$savexx10 = xx*10
lista$save = cbind(lista$savexx, lista$savexx10)

lista

}

store = f(1)

# whole list:
store

# elements of a list:
store$save_phrase
store$savexx
store$savexx10
store$save

【讨论】:

    【解决方案2】:

    1) 列表 我们可以在列表中返回所需的变量。

    f2 = function(number) {
    
        xx = NULL
        savexx = NULL
        savexx10 = NULL
        for (i in 1:10) {
          x = number*i
          xx = c(xx,x)
        }
    
        list(save_phrase = "hello", 
          savexx = xx,        
          savexx10 = xx*10,
          save = cbind(savexx,savexx10))
    
    }
    
    store = f2(1)
    

    2) mget 另一种方法是使用mget,如果返回的变量的名称与本例一样:

    f3 = function(number) {
    
        xx = NULL
        savexx = NULL
        savexx10 = NULL
        for (i in 1:10) {
          x = number*i
          xx = c(xx,x)
        }
    
        save_phrase = "hello"
        savexx = xx        
        savexx10 = xx*10
        save = cbind(savexx,savexx10)
    
        mget(ls(pattern = "save"))
    
    }
    
    store = f3(1)
    

    3) gsubfn gsubfn 可以将列表组件放入单独的变量中。运行后,save_phrasesavexxsavexx10save 将作为单独的变量存在。

    library(gsubfn)
    list[save_phrase, savexx, savexx10, save] <- f2(1)
    

    4) 附加虽然不建议这样做,但您可以这样做:

    attach(f2(1), name = "f2")
    

    这将在搜索列表中创建一个包含返回变量的条目,因此我们可以只引用save_phrasesavexxsavexx10save。我们可以使用 search()ls("f2") 看到条目,我们可以使用 detach("f2") 删除条目。

    5) 分配 另一种并非真正推荐但确实有效的可能性是将组件分配到特定环境中。现在save_phrasesavexxsavexx10save都将存在于全球环境中。

    list2env(f2(1), .GlobalEnv)
    

    同样,这会将这些变量注入当前环境。如果当前环境是全局环境,则与上一行相同。

    list2env(f2(1), environment())
    

    6) 同样,我不太确定这是一个好主意,但我们可以修改 f 以将输出直接注入父框架。运行后save_phrasesavexxsavexx10save都将存在于当前环境中。

    f4 = function(number, env = parent.frame()) {
    
        xx = NULL
        savexx = NULL
        savexx10 = NULL
        for (i in 1:10) {
          x = number*i
          xx = c(xx,x)
        }
    
        env$save_phrase = "hello"
        env$savexx = xx
        env$savexx10 = xx*10
        env$save = cbind(savexx,savexx10)
    
        invisible(env)
    
    }
    
    f4(1)
    

    【讨论】:

      【解决方案3】:

      R 函数只返回一个 SINGLE 对象。如果您希望返回多个对象,它们必须组合成一个列表或其他类型的对象。

      像 python 这样的一些语言让我们做这样的事情:

      a, b = mult_return_func()
      

      但是 R 只会返回一个对象。 R 程序员通常使用列表来返回多个对象。

      【讨论】:

        【解决方案4】:

        如果没有 return 语句,那么 R 将返回函数中最后一个计算表达式的值。

        这可以解释为什么它返回save = cbind(savexx,savexx10)

        要返回多个值,您需要一个列表或另一个对象,因为 R 的返回函数只能返回一个对象。

        我的建议是将这些值添加到列表中,返回列表,然后从列表中获取变量。

        我希望这会有所帮助。如果您想阅读更多内容,我建议您前往https://www.datamentor.io/r-programming/return-function/

        【讨论】:

          猜你喜欢
          • 2022-11-15
          • 1970-01-01
          • 1970-01-01
          • 2020-12-23
          • 1970-01-01
          • 1970-01-01
          • 2021-09-27
          • 2021-09-10
          • 2019-11-15
          相关资源
          最近更新 更多