2016-12-16 15 views
11

Patrząc na odpowiedź zamieszczoną niedawno na SO, zauważyłem nieznane oświadczenie o przypisaniu. Zamiast zwykłej formy myVar<- myValue używał on dla myVar[]<- myValue. Osobiście nigdy nie widziałem takiego zadania, ale miało bardzo użyteczny efekt - przekształciło przypisane dane myValue w kształt myVar.R: Łatwe przyporządkowanie z pustymi nawiasami kwadratowymi? x [] <-

Chciałbym użyć tego w moim kodzie. Jednak dokumentacja dla "<-" wydaje się milczeć na ten temat.

Czy jest to funkcja dobrze znana i można na niej polegać we wszystkich przypadkach?

Zgaduję również, że może to być efekt uboczny stosu wywołań funkcji, to jest wywoływanie kolejno sekwencji <- i [, ale nie mogłem ustalić, w jaki sposób. Czy ktoś może rzucić trochę światła na to?

Oto example--

# A dataframe 
df1<- data.frame(a=1:4, b=11:14) 

# simple assignment assigns to class of RHS 
df1<- c(21:24,31:34) 
df1 
#[1] 21 22 23 24 31 32 33 34 
class(df1) 
#[1] "integer" 

#assignment with [] casts to class of LHS 
df1<- data.frame(a=1:4, b=11:14) 
df1[]<- c(21:24,31:34) 
df1 

# a b 
# 1 21 31 
# 2 22 32 
# 3 23 33 
# 4 24 34 


# recycling to preserve shape 
df1[]<- c(101:102) 
df1 

#  a b 
# 1 101 101 
# 2 102 102 
# 3 101 101 
# 4 102 102 

class(df1) 
#data.frame 

# reshaping 

df1<- data.frame(a=1:4, b=11:14) 
df1[] <- matrix(1:8, 2,4) 
df1 #matrix reshaped 
class(df1) 
#[1] "data.frame" 

# flattening 
x<- 1:8 
x[]<- matrix(1:8,4,2) 
x 
#[1] 1 2 3 4 5 6 7 8 
+3

Kilka wskazówek: sprawdź '' Extract' i spróbuj uruchomić ''[<-' (df1 ,,, 8: 1)' – joran

+0

@joran: tak .. wydaje się, że powinienem tam zajrzeć. Wielkie dzięki. Patrzę na to i jutro się odwrócę. dobrze późno późno tutaj .. –

+3

Możesz wykopać logikę z 'body (" [<-. data.frame ")' jeśli czujesz się skłonny, ale nie jest przyjemną funkcją do przeczytania.To, o co pytasz, będzie dotyczyło sytuacji, w której brakuje zarówno "i", jak i "j" w wywołaniu funkcji. – nrussell

Odpowiedz

3

Jest to celowa i udokumentowana funkcja. Joran jak wspomniano, strona dokumentacja „Extract” obejmuje to w sekcji „Wektory” Atomic:

pusty wskaźnik wybiera wszystkie wartości: ten jest najczęściej stosowany w celu zastąpienia wszystkich wpisów, ale zachować atrybuty.

Jednakże, w przypadku przedmiotów cyklicznych (data.frames lub lists, na przykład), których własności są utrzymywane tylko na subsetted obiektu. Jego części nie mają takiej ochrony.

Oto przykład:

animals <- factor(c('cat', 'dog', 'fish')) 
df_factor <- data.frame(x = animals) 
rownames(df_factor) <- c('meow', 'bark', 'blub') 
str(df_factor) 
# 'data.frame': 3 obs. of 1 variable: 
# $ x: Factor w/ 3 levels "cat","dog","fish": 1 2 3 

df_factor[] <- 'cat' 
str(df_factor) 
# 'data.frame': 3 obs. of 1 variable: 
# $ x: chr "cat" "cat" "cat" 
rownames(df_factor) 
# [1] "meow" "bark" "blub" 

df_factor zachowała swój atrybut rownames, ale kolumna x jest tylko wektor znaków stosowane w przydziale zamiast czynnika. Możemy zachować klasę i poziom x przez specjalnie zastąpienie jej wartości:

df_factor <- data.frame(x = animals) 
df_factor$x[] <- 'cat' 
str(df_factor) 
# 'data.frame': 3 obs. of 1 variable: 
# $ x: Factor w/ 3 levels "cat","dog","fish": 1 1 1 

Więc wymiana z pustym podzbiorów jest bardzo bezpieczna dla wektory, macierze, i tablic, ponieważ ich elementy nie mogą mieć swoje własne atrybuty. Ale wymaga to trochę ostrożności, gdy mamy do czynienia z obiektami podobnymi do listy.

+0

Dzięki za wspaniałą odpowiedź. Widziałem tę linię z udokumentowanych, które podkreśliłeś i wydawało się sugerować (dla mnie), że operacja była bardzo bezpieczna, ale miałem przykłady, że było inaczej. Uwaga, że ​​"podelementy nie uzyskają takiej ochrony", kładzie na nich palec, a przykład dotyczy tego. Jedynym innym punktem, który chciałbym dodać (co jest właściwie nieodłączne w tej odpowiedzi) jest to, że ta operacja jest niezawodna tylko wtedy, gdy LHS jest bardziej złożona niż RHS –

-2

użyć [] zwykle podzbiór danych, gdzie df1[2] jest kolumna 2 z df1. W twoim przykładzie użyłeś go, by podać położenie matrycy lub wektora w postaci df1. Jeśli chcesz być w 100% pewien, że to jest umieścić w odpowiedniej kolumnie można nazwać właściwą kolumnę umieścić dane macierzy na przykład:

#create data frame df 
df1<- data.frame(a=1:4, b=11:14) 

#overwrite column 1 and 2 with matrix 
df1[1:2] <- matrix(1:8, 2,4) 

lub jeśli chcesz umieścić dodać dwie dodatkowe kolumny np kolumnie 3 i 4:

#create data frame df 
    df1<- data.frame(a=1:4, b=11:14) 
#matrix to data frame df in column 3 and 4 
    df1[3:4] <- matrix(1:8, 2,4) 
+2

Jego pytanie nie dotyczy ogólnie przypisania podzbiorów, ale konkretnego przypadku przypisania "x [] <- y", bez argumentów podzbioru. –

Powiązane problemy