Datensatz sukzessive einlesen und zwischenspeichern

Wie rufe ich R-Funktionen auf, wie selektiere ich Daten, ich weiß nicht genau ....

Moderatoren: EDi, jogo

Antworten
Fisch365
Beiträge: 9
Registriert: Fr Feb 12, 2021 5:36 pm

Datensatz sukzessive einlesen und zwischenspeichern

Beitrag von Fisch365 »

Hallo,
ich habe einen Datensatz und möchte ihn sukzessive einlesen (dies soll zur Simulation dienen). Ziel ist es aus dem Datensatz alle paar Sekunden eine neue Zeile einzulesen und das Zwischenergebnis zu sehen. Ich habe bisher folgenden Code, der jedoch nicht das tut, was ich möchte. Die print-Funktion ist nur zum Testen. Sie tut im Prinzip was ich möchte, sprich sie gibt mir alle paar Sekunden eine neue Zeile aus. Aber ich möchte die Zeilen speichern, das heißt alle paar Sekunden soll sich data2 von selbst aktualisieren und nicht erst am Ende genauso aussehen wie data1.

Viele Grüße

Code: Alles auswählen

set.seed(99)
data1 <- data.frame(person = sample(LETTERS[1:5], 50, T),
                    text = sample(stringi::stri_rand_lipsum(10), 50, T))

data2 <- data.frame(person = NA,
                    text = NA)

i = 1
while(TRUE) {
  if(i == nrow(data1)+1) {
    break
  }
  data2[i, ] <- data1[i, ]
  
  print(data2[i, ])
  Sys.sleep(3)
  
  i = i + 1
}
bigben
Beiträge: 2382
Registriert: Mi Okt 12, 2016 9:09 am

Re: Datensatz sukzessive einlesen und zwischenspeichern

Beitrag von bigben »

Hallo Fisch,

Deine while-Schleife ist ein klassisches Beispiel für etwas, das eine for-Schleife sein sollte. Der Code wird damit kürzer und übersichtlicher:

Code: Alles auswählen

set.seed(99)
data1 <- data.frame(person = sample(LETTERS[1:5], 50, T),
                    text = sample(stringi::stri_rand_lipsum(10), 50, T))

for(i in 1:nrow(data1)){
  data2 <- data1[i, ]
  print(data2)
  Sys.sleep(3)
}
Offensichtlich macht dieser Code nicht das, was Du möchtest. Wolltest Du eigentlich `data1[1:i, ]` wie in

Code: Alles auswählen

for(i in 1:nrow(data1)){
  data2 <- data1[1:i, ]
  print(data2)
  Sys.sleep(3)
  cat["\n . . . . . . . . . \n"]
}
?
Wenn nicht, dann erklär doch bitte das gewünschte Verhalten etwas ausführlicher.

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Fisch365
Beiträge: 9
Registriert: Fr Feb 12, 2021 5:36 pm

Re: Datensatz sukzessive einlesen und zwischenspeichern

Beitrag von Fisch365 »

Hallo Bernhard, danke für deine Antwort.
Das mit der for-Schleife hatte ich auch ausprobiert aber bringt mir auch nicht das gewünschte Ergebnis.

Ich möchte eigentlich den Datensatz nach und nach einlesen um ihn dann nach und nach zu analysieren. Beim Beispieldatensatz zum Beispiel die Wörter pro Aussage zählen und dann als Barplot darstellen. Dies soll aber relativ in Echtzeit geschehen. Bei deinem und meinem Vorgehen, wird der Text quasi in Echtzeit angezeigt durch den print-Befehlt aber in RStudio aktualisiert sich data2 nicht (ich weiß auch nicht, ob das überhaupt möglich ist oder notwendig), sondern wird erst angezeigt, wenn die Schleife durchgelaufen ist oder abgebrochen wird. Auch wundert es micht, wieso

Code: Alles auswählen

x <- 1

Sys.sleep(10)

x <- 2
mir nur x = 2 anzeigt und nicht schon x = 1
Viele Grüße
bigben
Beiträge: 2382
Registriert: Mi Okt 12, 2016 9:09 am

Re: Datensatz sukzessive einlesen und zwischenspeichern

Beitrag von bigben »

Hallo Fisch,

ich bin unsicher was Du meinst. data2 hat immer genau den Wert, den print(data2) ausgibt. Vermutlich meinst Du das environment tab in RStudio (rechts oben)? Das wird nicht ständig upgedated, sonst würde das R viel zu stark ausbremsen. Hier zum Beispiel kannst Du sehen, wie R die Zeichen in jeder Zeile zählt. Der Wert von i ändert sich ständig, trotzdem zeigt RStudio im Environment Tab diese Änderungen nicht an. Das ist aber kein Problem für das in RStudio laufende Programm.

Code: Alles auswählen

set.seed(99)
data1 <- data.frame(person = sample(LETTERS[1:5], 50, T),
                    text = sample(stringi::stri_rand_lipsum(10), 50, T))

for(i in 1:nrow(data1)){
  data2 <- data1[i, ]
  cat("\nZeile ");cat(i);cat(" hat ");
  cat(nchar(data1[i,2]))
  cat(" Zeichen.")
  Sys.sleep(2)
}
LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Fisch365
Beiträge: 9
Registriert: Fr Feb 12, 2021 5:36 pm

Re: Datensatz sukzessive einlesen und zwischenspeichern

Beitrag von Fisch365 »

Hallo Bernhard,

ja genau, das enviroment tab meinte ich, das aktualisiert sich nicht aber jetzt weiß ich warum nicht. Dein Code gibt mir alle 2 Sekunden die Zeichanzahl an, aber im Prinzip tut er das gleiche wie

Code: Alles auswählen

for (i in 1:nrow(data1)) {
cat("\nZeile ");cat(i);cat(" hat ");
cat(nchar(data1[i,2]))
cat(" Zeichen.")
Sys.sleep(2)
}
Ich glaube der Fehler liegt darin, dass Sys.sleep() erst nach dem Einlesen kommt. Also der PC bzw. R hat ja schon alle rows einglesen und erst dann wird zeitversetzt alle 2 Sekunden die Zeichananzahl ausgegben. Ich hätte gerne, dass er aber nur eine Zeile alle x-Sekunden einliest (ich glaube, ich habe mich oben anders ausgedrückt), irgendetwas damit macht wie nchar, und dann die zweite Zeile einliest.

Viele Grüße

EDIT: Okay, mein Fehler, es funktioniert doch, wie es sollte. Vielen Dank.
Zuletzt geändert von Fisch365 am Mi Okt 27, 2021 4:27 pm, insgesamt 1-mal geändert.
bigben
Beiträge: 2382
Registriert: Mi Okt 12, 2016 9:09 am

Re: Datensatz sukzessive einlesen und zwischenspeichern

Beitrag von bigben »

Hallo Fisch,

es tut mir Leid, aber ich verstehe offensichtlich die Aufgabenstellung nicht.

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Antworten