将函数的输出分配给R中的两个变量

Posted

技术标签:

【中文标题】将函数的输出分配给R中的两个变量【英文标题】:Assigning output of a function to two variables in R [duplicate] 【发布时间】:2012-07-23 23:33:20 【问题描述】:

可能重复:function with multiple outputs

这似乎是一个简单的问题,但我无法弄清楚,而且我在我看过的 R 手册中没有运气。我想找到dim(x),但我想在一行中将dim(x)[1] 分配给adim(x)[2] 分配给b

我试过[a b] <- dim(x)c(a, b) <- dim(x),但都没有成功。有没有一种方法可以做到这一点?这似乎是一件非常基本的事情,应该很容易处理。

【问题讨论】:

我知道是作弊:tmp <- dim(x); a <- tmp[1]; b <- tmp[2] 我会看看this question。最短的答案是否定的,R 不会那样做。长答案是,您始终可以使其适用于您的特定用例。但是没有像许多其他语言那样的“多重赋值”。 谢谢@贾斯汀。我知道其他语言会这样做,所以我希望有一个简单的方法。这不是一个巨大的效率问题或其他任何问题,只是 R 的一个有点恼人的“怪癖”(其中有很多,就像我喜欢这门语言一样!)。 【参考方案1】:

这取决于ab 中的内容。如果它们只是数字,请尝试返回这样的向量:

dim <- function(x,y) 
    return(c(x,y))
dim(1,2)[1]
# [1] 1
dim(1,2)[2]
# [1] 2

如果 ab 是其他内容,您可能需要返回一个列表

dim <- function(x,y)
    return(list(item1=x:y,item2=(2*x):(2*y)))
dim(1,2)[[1]]
[1] 1 2
dim(1,2)[[2]]
[1] 2 3 4

编辑:

试试这个:x &lt;- c(1,2); names(x) &lt;- c("a","b")

【讨论】:

我对你的建议有点困惑。 dim() 函数是内置的,我只想将尺寸分配给任意对象 ab 而不在调用 dim() 后执行该分配 感谢您的建议——names() 只影响输出的列名。如果您在运行该行后尝试a*3 之类的操作,则会收到错误消息。不幸的是,我认为没有内置的方法可以做到这一点,所以我只需要添加几行额外的代码来处理它。【参考方案2】:

看起来没有办法做到这一点。真正处理它的唯一方法是添加几行额外的行:

temp <- dim(x)
a <- temp[1]
b <- temp[2]

【讨论】:

【参考方案3】:

这可能不像您想要的那样简单,但这可以完成工作。如果您需要一次分配多个变量(并且您不知道您有多少值),它也是一个非常方便的工具。

Output <- SomeFunction(x)
VariablesList <- letters[1:length(Output)]
for (i in seq(1, length(Output), by = 1)) 
    assign(VariablesList[i], Output[i])

循环不是 R 中最有效的东西,但我已经多次使用它。我个人发现它在从条目数未知的文件夹中收集信息时特别有用。

编辑:在这种情况下,输出可以是任意长度(只要 VariablesList 更长)。

编辑 #2:按照 Liz 的建议,更改了 VariablesList 向量以允许更多值。

【讨论】:

如果您有很多输出,这是一个很好的解决方案,尽管对于我的情况可能不值得。不过,我可能会用VariablesList &lt;- letters[1:length(Output)] 替换您的第一行。 好主意,我已将其添加到我的帖子中。【参考方案4】:

您还可以编写自己的函数,该函数将始终生成全局 ab。但这是不可取的:

mydim <- function(x) 
  out <- dim(x)
  a <<- out[1]
  b <<- out[2]

执行此操作的“R”方法是将结果输出为列表或向量,就像内置函数一样,并根据需要访问它们:

out <- dim(x)

out[1]

out[2]

R 具有许多其他语言所缺乏的出色的列表和向量理解能力,因此没有这种多重赋值功能。相反,它具有丰富的函数集,无需循环构造即可访问复杂的数据结构。

【讨论】:

以上是关于将函数的输出分配给R中的两个变量的主要内容,如果未能解决你的问题,请参考以下文章

将运算符分配给 R 变量

如何将 lapply 的输出保存(分配)到 R 中的单个变量中?

输出:函数与分配给变量的函数

我如何使用bash将带有参数*的函数输出分配给变量?

将输出分配给Bash中的变量[重复]

如何将插入的输出值分配给 sql server 中的变量? [复制]