2012-07-25 69 views
4

可能重复:
function with multiple outputs分配函数的输出到两个变量中的R

这似乎是一个简单的问题,但我不出来,我的天堂”在我看过的R手册中运气不错。我想查找dim(x),但我想在一行中分配dim(x)[1]adim(x)[2]b

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

+0

我知道这是作弊:'tmp < - dim(x); a < - tmp [1]; b < - tmp [2]' – sgibb 2012-07-25 13:58:34

+0

好的解决方法:D – 2012-07-25 14:04:36

+2

我会看看[这个问题](http://stackoverflow.com/questions/1826519/function-returning-more-than-one-value) 。最短的答案是否定的,R不这样做。长久的回答是,您可以随时使其适用于您的特定用例。但是在许多其他语言中没有“多重任务”。 – Justin 2012-07-25 14:17:16

回答

0

这可能不是那么简单,你本来想一个解决方案,但是这能够完成任务。如果你需要一次分配多个变量(你不知道你有多少个值),它也是一个非常方便的工具。

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:改变了VariablesList向量以允许更多的值,正如Liz所建议的。

+0

这是一个非常好的解决方案,如果你有很多输出,尽管可能不适合我的情况。不过,我可能会用'VariablesList < - letters [1:length(Output)]'替换你的第一行。 – 2012-07-25 15:07:24

+0

好主意,我已经添加到我的文章。 – MikeZ 2012-07-25 15:32:10

-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 <- c(1,2); names(x) <- c("a","b")

+0

我对你的建议有点困惑。 'dim()'函数是内置的,我只是想调用'dim()'后调用任意对象'a'和'b'的尺寸'' – 2012-07-25 14:06:53

+0

感谢您的建议 - 'name )'只影响输出的列名。如果您在运行该行后尝试了类似“a * 3”的操作,则会出现错误。不幸的是,我认为没有内置的方式来做到这一点,所以我只需要添加几条额外的行来处理它。 – 2012-07-25 14:20:56

0

看起来没有办法做到这一点。真正对付它的唯一方法是添加额外的行一对夫妇:

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

您也可以编写自己的函数,它将始终创建一个全局函数ab。但是,这是不可取的:

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

的“R”的方式来做到这一点是输出的结果作为一个列表或向量就像根据需要内置的功能也和访问它们:

out <- dim(x) 

out[1] 

out[2] 

R有很多其他语言缺乏的优秀列表和矢量理解,因此没有这种多重分配功能。相反,它有一组丰富的函数,可以在没有循环构造的情况下进入复杂的数据结构。

相关问题