Einen numerischen Vektor mit Namen in einer Anweisung erstellen?


71

Ich versuche, den Standardwert für einen Funktionsparameter auf eine benannte Zahl festzulegen. Gibt es eine Möglichkeit, eine in einer einzelnen Anweisung zu erstellen? Ich habe? Numerisch und? Vektor überprüft, aber es scheint nicht so. Vielleicht kann ich eine Matrix oder einen data.frame konvertieren / erzwingen und das gleiche Ergebnis in einer Anweisung erzielen? Um es klar zu sagen, ich versuche Folgendes auf einmal zu tun:

test = c( 1 , 2 )
names( test ) = c( "A" , "B" )

Antworten:


19

Die Konvention zum Benennen von Vektorelementen ist dieselbe wie bei Listen:

newfunc <- function(A=1, B=2) { body}  # the parameters are an 'alist' with two items

Wenn Sie stattdessen möchten, dass dies ein Parameter ist, der ein benannter Vektor ist (die Art von Funktion, die die von bereitgestellten Argumente verarbeitet apply):

newfunc <- function(params =c(A=1, B=2) ) { body} # a vector wtih two elements

Wenn Sie stattdessen möchten, dass dies ein Parameter ist, der eine benannte Liste ist:

newfunc <- function(params =list(A=1, B=2) ) { body} 
    # a single parameter (with two elements in a list structure

Ah! Ich habe diese Notation nie ausprobiert, weil ich dachte, sie sei auf Listen und Daten beschränkt. Frames
SFun28

1
Diese Antwort enthält die Antwort von @joran , aber es ist schwer zu sagen, weil sie hier versteckt ist:function(params= ...) { body }
Die rote Erbse

Ich denke, wir lesen die Frage anders. Ich dachte, die Frage betraf Funktionsparameter. Joran dachte, die Frage betraf die Benennung von Listen- oder Vektorelementen. Es ist eine Art Unterscheidung ohne großen Unterschied, da Funktionsparameter eine Art Liste sind.
IRTFM

Eigentlich verstehe ich diese Antwort nicht: Vielleicht wäre ein konkreter Fall für bodyund wie newfuncman die angeforderte Datenstruktur erhält, hilfreich.
U. Windl

Ich beantwortete die Frage (die nicht nach einem Anwendungsfall fragte, sondern nur nach syntaktischen Möglichkeiten). Wenn Sie dies für eine bestimmte Aktion benötigen, sollten Sie eine Frage mit Daten posten und sagen, was Sie tun müssen.
IRTFM


61

... als Randnotiz structurekönnen Sie mit der Funktion ALLE Attribute festlegen, nicht nur Namen:

structure(1:10, names=letters[1:10], foo="bar", class="myclass")

Welches würde produzieren

 a  b  c  d  e  f  g  h  i  j 
 1  2  3  4  5  6  7  8  9 10 
attr(,"foo")
[1] "bar"
attr(,"class")
[1] "myclass"

52

Wie wäre es mit:

 c(A = 1, B = 2)
A B 
1 2 

Plus eins für den einfachsten Ansatz zum Erstellen eines benannten Vektors.
Karl Baker

5

magrittr bietet eine schöne und saubere Lösung.

result = c(1,2) %>% set_names(c("A", "B"))
print(result)
A B 
1 2

Sie können es auch verwenden, um data.frames in Vektoren umzuwandeln.

df = data.frame(value=1:10, label=letters[1:10])
vec = extract2(df, 'value') %>% set_names(df$label)
vec
 a  b  c  d  e  f  g  h  i  j 
 1  2  3  4  5  6  7  8  9 10
df
    value label
 1      1     a
 2      2     b
 3      3     c
 4      4     d
 5      5     e
 6      6     f
 7      7     g
 8      8     h
 9      9     i
 10    10     j

Das einfachste, wenn Sie möchten, dass die Namen mit dem Vektor c(1,2) %>%set_names(.)
identisch sind,

0

Um die Antwort von @ joran zu erweitern (ich konnte dies nicht als Kommentar korrekt formatieren): Wenn der benannte Vektor einer Variablen zugewiesen ist, wird auf die Werte von A und B über eine Teilmenge mit der [Funktion zugegriffen . Verwenden Sie die Namen, um den Vektor auf dieselbe Weise zu unterteilen, wie Sie die Indexnummer für die Untermenge verwenden könnten:

my_vector = c(A = 1, B = 2)    
my_vector["A"] # subset by name  
# A  
# 1  
my_vector[1] # subset by index  
# A  
# 1  
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.