还在试着进入R逻辑…什么是解包(在LHS上)一个函数返回多个值的结果的“最佳”方法?

显然我不能这么做:

R> functionReturningTwoValues <- function() { return(c(1, 2)) }
R> functionReturningTwoValues()
[1] 1 2
R> a, b <- functionReturningTwoValues()
Error: unexpected ',' in "a,"
R> c(a, b) <- functionReturningTwoValues()
Error in c(a, b) <- functionReturningTwoValues() : object 'a' not found

我真的必须做以下事情吗?

R> r <- functionReturningTwoValues()
R> a <- r[1]; b <- r[2]

或者R程序员会这样写:

R> functionReturningTwoValues <- function() {return(list(first=1, second=2))}
R> r <- functionReturningTwoValues()
R> r$first
[1] 1
R> r$second
[1] 2

——被编辑来回答谢恩的问题——

我真的不需要给结果值部分命名。我将一个聚合函数应用于第一个组件,另一个应用于第二个组件(最小值和最大值)。如果这两个组件是相同的函数,我就不需要拆分它们了)。


当前回答

通常我把输出包装成一个列表,这是非常灵活的(你可以有任何组合的数字,字符串,向量,矩阵,数组,列表,对象输出)

就像:

func2<-function(input) {
   a<-input+1
   b<-input+2
   output<-list(a,b)
   return(output)
}

output<-func2(5)

for (i in output) {
   print(i)
}

[1] 6
[1] 7

其他回答

要从一个函数中获得多个输出并保持所需的格式,您可以从函数内部将输出保存到硬盘(在工作目录中),然后从函数外部加载它们:

myfun <- function(x) {
                      df1 <- ...
                      df2 <- ...
                      save(df1, file = "myfile1")
                      save(df2, file = "myfile2")
}
load("myfile1")
load("myfile2")

如果你想将函数的输出返回给全局环境,你可以使用list2env,如下例所示:

myfun <- function(x) { a <- 1:x
                       b <- 5:x
                       df <- data.frame(a=a, b=b)

                       newList <- list("my_obj1" = a, "my_obj2" = b, "myDF"=df)
                       list2env(newList ,.GlobalEnv)
                       }
    myfun(3)

这个函数将在全局环境中创建三个对象:

> my_obj1
  [1] 1 2 3

> my_obj2
  [1] 5 4 3

> myDF
    a b
  1 1 5
  2 2 4
  3 3 3

(一) 如果foo和bar都是一个数字,那么c(foo,bar)没有问题;你也可以命名这些组件:c(Foo= Foo,Bar= Bar)。所以你可以访问结果res的组件res[1] res[2];或在命名的情况下,如res["Foo"], res["BAR"]。

[B] 如果foo和bar是相同类型和长度的向量,那么返回cbind(foo,bar)或rbind(foo,bar)也没有问题;同样值得注意的。在'cbind'情况下,您将访问foo和bar为res[,1], res[,2]或res[," foo "], res[," bar "]。你可能更喜欢返回一个数据框架而不是一个矩阵:

data.frame(Foo=foo,Bar=bar)

并访问它们为res$Foo res$Bar如果foo和bar的长度相同但类型不同(例如,foo是一个数字向量,bar是一个字符串向量),这也可以很好地工作。

[C] 如果foo和bar完全不同,不能像上面那样方便地组合,那么你肯定应该返回一个列表。

例如,你的函数可能适合线性模型 还要计算预测值,这样你就可以

LM<-lm(....) ; foo<-summary(LM); bar<-LM$fit

然后你会返回list(Foo= Foo, Bar= Bar),然后访问摘要res$Foo,预测值res$Bar

来源:http://r.789695.n4.nabble.com/How-to-return-multiple-values-in-a-function-td858528.html

functionReturningTwoValues <- function() { 
  results <- list()
  results$first <- 1
  results$second <-2
  return(results) 
}
a <- functionReturningTwoValues()

我认为这是可行的。

那么使用assign呢?

functionReturningTwoValues <- function(a, b) {
  assign(a, 1, pos=1)
  assign(b, 2, pos=1)
}

您可以通过引用传递想要传递的变量的名称。

> functionReturningTwoValues('a', 'b')
> a
[1] 1
> b
[1] 2

如果需要访问现有值,则与assign相反的是get。