In Funktion auf Variable zugreifen

Wie erweitere ich R um eigene Funktionen oder Pakete? Welches Paket ist passend für meine Fragestellung?

Moderatoren: EDi, jogo

anfänger
Beiträge: 6
Registriert: Fr Mai 01, 2020 7:24 pm

In Funktion auf Variable zugreifen

Beitrag von anfänger »

Erstmal einen schönen guten Abend zusammen,

ich habe folgendes Problem:
Ich möchte eine Funktion schreiben, welche einen Datensatz und eine Variable innerhalb dieses Datensatzes (Datum) übergeben bekommt.

funktion <- function(datensatz, datumsvariable)

Jetzt möchte ich innerhalb meiner Funktion ein Subset erstellen, welches nur Daten eines bestimmten Datums enthält.
Im Prinzp also einfach: subset(datensatz, datumsvariable == 2020)
Hier erhalte ich aber kein Ergebnis, bzw. der Datensatz ist leer. Wie schaffe ich es, dieses Subset zu bilden?

Vollständiger Code sähe dann so aus:

Code: Alles auswählen

funktion <- function(datensatz, datumsvariable){
Jahr2020 <- subset(datensatz, datumsvariable == 2020)
return(Jahr2020)
}

funktion(datensatz = mein_datensatz, datumsvariable ="year")
Hoffe ich habe mich einigermaßen verständlich ausgedrückt und ihr könnt mir helfen. Vielen Dank. :)

BTW: Dieses Problem entsteht auch in folgender Konstellation:

Code: Alles auswählen

variable <- "year"
subset(mein_datensatz, variable == 2020) 
Ich denke es liegt daran, dass es in "mein_datensatz" keine Variable "variable" gibt. Also wie schaffe ich es, dass R auf den Wert der Variable zugreift und nicht auf den Namen? Nochmals: Danke!
Zuletzt geändert von jogo am Fr Mai 01, 2020 8:15 pm, insgesamt 1-mal geändert.
Grund: Formatierung verbessert, siehe http://forum.r-statistik.de/viewtopic.php?f=20&t=29
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: In Funktion auf Variable zugreifen

Beitrag von jogo »

Hallo anfänger,

willkommen im Forum!
Wenn ich das richtig verstanden habe, möchtest Du den Namen der Spalte an die Funktion übergeben.
Der Zugriff muss dann etwas anders erfolgen:

Code: Alles auswählen

funktion <- function(datensatz, datumsvariable) {
  datensatz[datensatz[, datumsvariable]==2020, ]
}
Hier ein funktionierendes Beispiel:

Code: Alles auswählen

funktion <- function(datensatz, datumsvariable) {
  datensatz[datensatz[, datumsvariable]>7, ]
}

funktion(iris, "Sepal.Length")
Gruß, Jörg
p.s.: Bitte formatiere Codestücke entsprechend; lies im Bereich FAQ
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: In Funktion auf Variable zugreifen

Beitrag von EDi »

subset() ist gut für den interaktiven Gebrauch, aber nicht gut zum programmieren.


Ich verwende nie subset, die eckige Klammer ist ausreichend...

Siehe auch http://adv-r.had.co.nz/Computing-on-the ... tml#subset
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.

Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
Bild.
anfänger
Beiträge: 6
Registriert: Fr Mai 01, 2020 7:24 pm

Re: In Funktion auf Variable zugreifen

Beitrag von anfänger »

Super. Hat mir sehr geholfen.
Vielen Dank euch beiden! :)
anfänger
Beiträge: 6
Registriert: Fr Mai 01, 2020 7:24 pm

Re: In Funktion auf Variable zugreifen

Beitrag von anfänger »

Hallo nochmal,

habe direkt noch eine Frage:
Wie kann ich einer Variable einen String übergeben, der einen Zeilenumbruch enthält?

Code: Alles auswählen

string <- "Hallo \n Welt" #funktioniert nicht
string <- print("Hallo \n Welt") #funktioniert nicht und gibt den String auch direkt aus, statt ihn nur zu speichern
string <- cat("Hallo \n Welt") #übernimmt zwar den Zeilenumbruch, gibt den String aber direkt aus und speichert ihn nicht


Kennt jemand die Lösung? Vielen Dank :)
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: In Funktion auf Variable zugreifen

Beitrag von jogo »

Du solltest einen neuen Gesprächsfaden eröffnen, denn der Inhalt der Frage ist ein völlig anderer.

meinst Du sowas

Code: Alles auswählen

string <- "Hallo \n Welt" 
cat(string)
oder sowas?

Code: Alles auswählen

cat(string <- "Hallo \n Welt")
Gruß, Jörg
anfänger
Beiträge: 6
Registriert: Fr Mai 01, 2020 7:24 pm

Re: In Funktion auf Variable zugreifen

Beitrag von anfänger »

jogo hat geschrieben: Sa Mai 02, 2020 3:09 pm Du solltest einen neuen Gesprächsfaden eröffnen, denn der Inhalt der Frage ist ein völlig anderer.

meinst Du sowas

Code: Alles auswählen

string <- "Hallo \n Welt" 
cat(string)
oder sowas?

Code: Alles auswählen

cat(string <- "Hallo \n Welt")
Gruß, Jörg
Hallo Jörg, danke für deine Antwort.

Nein. Ich suche eine Lösung, welche (innerhalb einer Funktion) einen string mit Zeilenumbruch in einer Variable speichert.
Diese Variable soll am Ende der Funktion in einer Liste gespeichert werden und nach der Ausführung der Funktion soll dieser string (nur bei Bedarf) über funktion$string abgerufen werden und mit Zeilenumbruch ausgeführt werden.

Daher verbietet sich (so wie ich es verstehe) jede Anwendung von print(), cat() oder sonstigen Ausführenden Funktionen, da mit diesen der string schon während der Ausführung der Funktion ausgegeben wird und nicht erst nach dem Abrufen aus der Liste.

Entschuldige, wenn ich mich hier vielleicht etwas unklar ausdrücke. Wenn man noch nicht den ganz großen Einblick hat, ist es auch schwieriger die Probleme vernünftig zu formulieren. :D
Athomas
Beiträge: 769
Registriert: Mo Feb 26, 2018 8:19 pm

Re: In Funktion auf Variable zugreifen

Beitrag von Athomas »

Wenn Du dazu eine Nachfrage hast, werde ich mich an der Beantwortung nur beteiligen, wenn Du etwas zum tieferen Sinn dieses "Problems" sagst.
Selbst ausgedachte Übungsaufgaben bitte ich nach Möglichkeit auch selbst zu lösen!

Code: Alles auswählen

Spielerei <- function(){
  Zahlen <- 1:10  
  Text   <- "Hubba Bubba\nKaubonbon"
  return(list(Anderes=Zahlen, Meldung=Text))
}
cat(Spielerei()$Meldung)
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: In Funktion auf Variable zugreifen

Beitrag von jogo »

Hallo anfänger,
anfänger hat geschrieben: So Mai 03, 2020 12:26 pm Nein. Ich suche eine Lösung, welche (innerhalb einer Funktion) einen string mit Zeilenumbruch in einer Variable speichert.
genau dies habe ich Dir gezeigt.

Code: Alles auswählen

string <- "Hallo \n Welt" 
cat(string)
Diese Variable soll am Ende der Funktion in einer Liste gespeichert werden und nach der Ausführung der Funktion soll dieser string (nur bei Bedarf) über funktion$string abgerufen werden und mit Zeilenumbruch ausgeführt werden.
Wenn das Objekt funktion eine Funktion in R ist, wird funktion$string einen Syntaxfehler erzeugen, Beispiel:

Code: Alles auswählen

mean$string
Daher verbietet sich (so wie ich es verstehe) jede Anwendung von print(), cat() oder sonstigen Ausführenden Funktionen, da mit diesen der string schon während der Ausführung der Funktion ausgegeben wird und nicht erst nach dem Abrufen aus der Liste.
das ist dann ein anderes Problem. Meinst Du zufällig so etwas wie eine permanente Variable (in R müsste man es ein permanentes Objekt nennen)?
... und dieses soll durch eine Funktion verfügbar sein.
Entschuldige, wenn ich mich hier vielleicht etwas unklar ausdrücke. Wenn man noch nicht den ganz großen Einblick hat, ist es auch schwieriger die Probleme vernünftig zu formulieren. :D
Vielleicht kennst Du andere Programmiersprachen, so dass Du deren Begrifflichkeiten oder sogar Codebeispiele nutzen kannst, um Dein Problem exakt zu beschreiben.

Bei dem, was ich bisher verstanden habe (siehe oben, Stichwort permanentes Objekt), sieht meine aktuelle Lösung so aus:

Code: Alles auswählen

permVar <- function(myvar) function() list(string=myvar)

myfkt <- permVar("Hallo \n Welt")

cat(myfkt()$string)
Andererseits kann ich mir auch vorstellen, dass Dir nicht ganz klar ist, wann ein in einem character vorhandener Zeilenumbruch interpretiert wird (also auch wirklich die Zeile an der Stelle umgebrochen wird) und wann das Vorhandensein eines Zeilenumbruchs symbolisch dargestellt wird durch "\n".

Ansonsten schließe ich mich der Aufforderung von Athomas an:
zeige uns ein Beispiel, in dem genau dieses Verhalten wichtig ist.
Was soll dabei erreicht werden?

Gruß, Jörg
anfänger
Beiträge: 6
Registriert: Fr Mai 01, 2020 7:24 pm

Re: In Funktion auf Variable zugreifen

Beitrag von anfänger »

Danke für eure Antworten.

"Notwendig" ist dieses Verhalten nicht. Ist wohl eher ein "optisches" Problem. Weil ein Ergebnis "schöner" über mehrere Zeilen, als in einer Zeile präsentiert werden kann.

Hier ein stark vereinfachtes Beispiel: Ich habe eine Funktion, welche mir für verschiedene Inputvariablen den Mittelwert und die Differenz zwischen den Mittelwerten berechnet

Code: Alles auswählen

mittelwerte <- function(input1, input2, input3){
mittelwert1 <- mean(input1)
mittelwert2 <- mean(input2)
mittelwert3 <- mean(input3)

differenz12 <- mittelwert1 - mittelwert2
differenz13 <- mittelwert1 - mittelwert3

werte <- cbind(mittelwert1, mittelwert2, mittelwert3)
differenz <- paste("Die Differenz zwischen Wert 1 & Wert 2 beträgt", differenz12, "\nDie Differenz zwischen Wert 1 und Wert 3 beträgt", differenz13)

return <- list("Werte" = werte, "Differenz"=differenz)
}

Ist natürlich jetzt kein besonders wertvolles Beispiel, da recht simpel, aber ich denke es veranschaulicht das "Problem".
Ziel wäre es jetzt durch:

Code: Alles auswählen

ergebnis <- mittelwert(1:3,2:4,3:5)
ergebnis$differenz
Ein Ergebnis zu erhalten, welches den Zeilenumbruch enthält.

Klar, man könnte es durch cat(ergebnis$differenz) lösen, das würde aber voraussetzen, dass jeder Nutzer der Funktion (wenn man weiter denkt) wissen müsste, dass er hier ein cat() setzen muss.
Ich hab's jetzt mit einer "Tabelle" also cbind() gelöst, gefällt mir nicht so gut, ist aber i.O.

Falls dieses "Problem" und meine Frage in diesem Forum hier jetzt unpassend oder nicht gewollt ist, tut es mir leid. Allerdings war ich der Meinung, dass man dieses "Problem" eines mehrzeiligen Returns aus einer Funktion doch irgendwie lösen können muss. Google hat mir nicht geholfen, deshalb die Nachfrage. Falls unpassend -> Sorry!

Liebe Grüße
Antworten