将函数的输出分配给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]
分配给a
和dim(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】:
这取决于a
和b
中的内容。如果它们只是数字,请尝试返回这样的向量:
dim <- function(x,y)
return(c(x,y))
dim(1,2)[1]
# [1] 1
dim(1,2)[2]
# [1] 2
如果 a
和 b
是其他内容,您可能需要返回一个列表
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 <- c(1,2); names(x) <- c("a","b")
【讨论】:
我对你的建议有点困惑。dim()
函数是内置的,我只想将尺寸分配给任意对象 a
和 b
而不在调用 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 <- letters[1:length(Output)]
替换您的第一行。
好主意,我已将其添加到我的帖子中。【参考方案4】:
您还可以编写自己的函数,该函数将始终生成全局 a
和 b
。但这是不可取的:
mydim <- function(x)
out <- dim(x)
a <<- out[1]
b <<- out[2]
执行此操作的“R”方法是将结果输出为列表或向量,就像内置函数一样,并根据需要访问它们:
out <- dim(x)
out[1]
out[2]
R 具有许多其他语言所缺乏的出色的列表和向量理解能力,因此没有这种多重赋值功能。相反,它具有丰富的函数集,无需循环构造即可访问复杂的数据结构。
【讨论】:
以上是关于将函数的输出分配给R中的两个变量的主要内容,如果未能解决你的问题,请参考以下文章