Возвращение нескольких объектов в R-функцию
Как вернуть несколько объектов в функцию R? В Java я бы сделал класс, возможно Person
, который имеет некоторые частные переменные и инкапсулирует, может быть, height
, age
и т.д.
Но в R мне нужно передать группы данных. Например, как я могу заставить функцию R возвращать как список символов, так и целое число?
Ответы
Ответ 1
В отличие от многих других языков, функции R не возвращают несколько объектов в строгом смысле. Самый общий способ справиться с этим - вернуть объект list
. Поэтому, если в вашей функции есть целое число foo
и вектор строк bar
, вы можете создать список, который объединяет эти элементы:
foo <- 12
bar <- c("a", "b", "e")
newList <- list("integer" = foo, "names" = bar)
Затем return
этот список.
После вызова вашей функции вы можете получить доступ к каждому из них с помощью newList$integer
или newList$names
.
Другие типы объектов могут работать лучше для различных целей, но объект list
- хороший способ начать работу.
Ответ 2
Аналогично в Java вы можете создать класс S4 в R, который инкапсулирует вашу информацию:
setClass(Class="Person",
representation(
height="numeric",
age="numeric"
)
)
Затем ваша функция может вернуть экземпляр этого класса:
myFunction = function(age=28, height=176){
return(new("Person",
age=age,
height=height))
}
и вы можете получить доступ к своей информации:
aPerson = myFunction()
[email protected]
[email protected]
Ответ 3
Что-то в этом роде, что вы ищете?
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)
Ответ 4
Вы также можете использовать супер-назначение.
Вместо "< -" типа "< < -". Функция будет рекурсивно и многократно искать один функциональный уровень выше для объекта с таким именем. Если он не может найти его, он будет создавать один на глобальном уровне.
Ответ 5
Вы можете использовать for()
с assign()
для создания множества объектов.
См. Пример из 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..$")
Ответ 6
Один из способов справиться с этим состоит в том, чтобы поместить информацию как атрибут на основной. Я должен подчеркнуть, я действительно думаю, что это подходящая вещь, которую нужно делать только тогда, когда две части информации связаны друг с другом, так что у вас есть информация о другом.
Например, я иногда запечатываю имя "важные переменные" или переменные, которые были значительно изменены путем хранения списка имен переменных в качестве атрибута в кадре данных:
attr(my.DF, 'Modified.Variables') <- DVs.For.Analysis$Names.of.Modified.Vars
return(my.DF)
Это позволяет мне хранить список имен переменных с самим фреймом данных.