这个问题在这里已有答案:
如何在R函数中返回多个对象?在Java中,我会创建一个类,也许是 Person ,它有一些私有变量和封装,可能是 height , age 等 .
Person
height
age
但在R中,我需要传递一组数据 . 例如,如何使R函数返回字符列表和整数?
您可以使用 for() 和 assign() 来创建许多对象 . 请参阅 assign() 中的示例:
for()
assign()
for(i in 1:6) { #-- Create objects 'r.1', 'r.2', ... 'r.6' -- nam <- paste("r", i, sep = ".") assign(nam, 1:i)
寻找新的对象
ls(pattern = "^r..$")
与许多其他语言不同,R函数不会严格意义上返回多个对象 . 处理此问题的最常用方法是返回 list 对象 . 因此,如果您的函数中有一个整数 foo 和一个字符串 bar 的向量,您可以创建一个组合这些项的列表:
list
foo
bar
foo <- 12 bar <- c("a", "b", "e") newList <- list("integer" = foo, "names" = bar)
然后 return 这个清单 .
return
调用函数后,您可以使用 newList$integer 或 newList$names 访问其中的每一个 .
newList$integer
newList$names
其他对象类型可能更好地用于各种目的,但 list 对象是一个很好的入门方法 .
类似地,在Java中,您可以在R中创建一个封装您的信息的S4类:
setClass(Class="Person", representation( height="numeric", age="numeric" ) )
然后你的函数可以返回这个类的一个实例:
myFunction = function(age=28, height=176){ return(new("Person", age=age, height=height)) }
并且您可以访问您的信息:
aPerson = myFunction() aPerson@age aPerson@height
这些是你想要的东西吗?
x1 = function(x){ mu = mean(x) l1 = list(s1=table(x),std=sd(x)) return(list(l1,mu)) } library(Ecdat) data(Fair) x1(Fair$age)
您还可以使用超级分配 .
而不是“< - ”键入“<< - ” . 该函数将递归地重复搜索该名称对象的一个更高级别的功能级别 . 如果找不到,它将在全局级别创建一个 .
处理此问题的一种方法是将信息作为属性放在主要信息上 . 我必须强调,我真的认为只有当两条信息相关时才能做到这一点,以便一方有关于另一方的信息 .
例如,我有时通过在数据框中存储变量名称列表作为属性来隐藏已经显着修改的“关键变量”或变量的名称:
attr(my.DF, 'Modified.Variables') <- DVs.For.Analysis$Names.of.Modified.Vars return(my.DF)
这允许我用数据框本身存储变量名列表 .
6 回答
您可以使用
for()
和assign()
来创建许多对象 . 请参阅assign()
中的示例:寻找新的对象
与许多其他语言不同,R函数不会严格意义上返回多个对象 . 处理此问题的最常用方法是返回
list
对象 . 因此,如果您的函数中有一个整数foo
和一个字符串bar
的向量,您可以创建一个组合这些项的列表:然后
return
这个清单 .调用函数后,您可以使用
newList$integer
或newList$names
访问其中的每一个 .其他对象类型可能更好地用于各种目的,但
list
对象是一个很好的入门方法 .类似地,在Java中,您可以在R中创建一个封装您的信息的S4类:
然后你的函数可以返回这个类的一个实例:
并且您可以访问您的信息:
这些是你想要的东西吗?
您还可以使用超级分配 .
而不是“< - ”键入“<< - ” . 该函数将递归地重复搜索该名称对象的一个更高级别的功能级别 . 如果找不到,它将在全局级别创建一个 .
处理此问题的一种方法是将信息作为属性放在主要信息上 . 我必须强调,我真的认为只有当两条信息相关时才能做到这一点,以便一方有关于另一方的信息 .
例如,我有时通过在数据框中存储变量名称列表作为属性来隐藏已经显着修改的“关键变量”或变量的名称:
这允许我用数据框本身存储变量名列表 .