Возвращение нескольких объектов в 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)

Это позволяет мне хранить список имен переменных с самим фреймом данных.