Zwracanie wielu obiektów w funkcji R [duplikat]

To pytanie ma już odpowiedź tutaj:

Jak mogę zwrócić wiele obiektów w funkcji R? W Javie zrobiłbym klasę, może Person która ma jakieś prywatne zmienne i enkapsuluje, może, height, age, itd.

Ale w R, muszę przejść grupy danych. Na przykład, jak sprawić, by funkcja R zwróciła zarówno listę znaków, jak i liczbę całkowitą?

 115
Author: Hack-R, 2012-01-20

6 answers

W przeciwieństwie do wielu innych języków, funkcje R nie zwracają wielu obiektów w ścisłym znaczeniu. Najbardziej ogólnym sposobem na to jest zwrócenie list obiektu. Więc jeśli masz w swojej funkcji liczbę całkowitą foo i Wektor łańcuchów bar, możesz utworzyć listę, która łączy te elementy:

foo <- 12
bar <- c("a", "b", "e")
newList <- list("integer" = foo, "names" = bar)

Następnie return Ta lista.

Po wywołaniu funkcji, możesz uzyskać dostęp do każdej z nich za pomocą newList$integer lub newList$names.

Inne typy obiektów mogą działać lepiej dla różnych cele, ale obiekt list jest dobrym sposobem na rozpoczęcie.

 170
Author: ChadBDot,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-20 02:45:58

Podobnie w Javie, możesz utworzyć klasę S4 W R, która hermetyzuje Twoje informacje:

setClass(Class="Person",
         representation(
            height="numeric",
            age="numeric"
          )
)

Wtedy twoja funkcja może zwrócić instancję tej klasy:

myFunction = function(age=28, height=176){
  return(new("Person",
          age=age,
          height=height))
}

I możesz uzyskać dostęp do swoich informacji:

aPerson = myFunction()

aPerson@age
aPerson@height
 30
Author: RockScience,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-03 01:35:35

Czy coś w tym stylu jest tym, czego szukasz?

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)
 16
Author: aatrujillob,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-20 02:51:19

Możesz również użyć super-przydziału.

Zamiast "

 4
Author: Daniel Morgan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-01 13:47:06

Możesz użyć for() z assign() do tworzenia wielu obiektów. Zobacz przykład z assign():

for(i in 1:6) { #-- Create objects  'r.1', 'r.2', ... 'r.6' --
    nam <- paste("r", i, sep = ".")
    assign(nam, 1:i)

Szukanie nowych obiektów

ls(pattern = "^r..$")
 1
Author: fvfaleiro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-21 13:30:33

Jednym ze sposobów radzenia sobie z tym jest umieszczenie informacji jako atrybutu na głównym. Muszę podkreślić, że naprawdę uważam, że jest to właściwa rzecz, aby zrobić tylko wtedy, gdy dwa kawałki informacji są powiązane tak, że jeden ma informacje o drugim.

Na przykład czasami przechowuję nazwę "kluczowych zmiennych" lub zmiennych, które zostały znacznie zmodyfikowane przez przechowywanie listy nazw zmiennych jako atrybutu w ramce danych:

attr(my.DF, 'Modified.Variables') <- DVs.For.Analysis$Names.of.Modified.Vars
return(my.DF)

To pozwala mi przechowywać lista nazw zmiennych wraz z samą ramką danych.

 1
Author: HoneyBuddha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-28 02:11:21