R



  • Hallo, ich suche eine Möglichkeit R in der Konsole so aufzurufen, dass es gepiped werden kann und die Standardeingabe ausliest.

    Konkret habe ich ein Skript, dass eine csv-datei auf der konsole ausgibt.

    nehmen wir an es sähe so aus:

    0,0
    1,1
    2,4
    3,9
    4,16
    

    bisher kenne ich nur eine Möglichkeit R Skripten in der Konsole auzuführen

    R --slave < script.r
    

    nun würde ich so gerne die obige tabelle einlesen, naiv würde ich

    read.table("/dev/stdin" , header=F)
    

    verwenden.

    Nur weiß ich nicht wie ich das ganze zusammenfügen muss. Die Ausgabe von R soll auch in der Konsole sein und weiter verarbeitet werden können, also am Ende sowas wie

    schreibeDaten.script | <benutze R-Skript und schreibe Daten auf Konsole> | parseR.script | machWasMitAusgaben.script ...
    

    herauskommt.

    Ich hoffe man kann verstehen, worauf das ganze hinaus soll.
    Ich bedanke mich schon mal für eure Hilfe !



  • Es gibt stdin(), stdout(), stderr() und außerdem sollte auch file = "" meistens gehen.



  • Also ich hab es nochmal versucht und das ist das ergebnis:

    Ubuntu 10.04

    python3.1 script.py | R --slave --file="r.r" // thats what i typed into bash

    script.py:
    for i in range(10):
    print(str(i) + "," + str(i**2))

    r.r:
    read.table(file = "/dev/stdin", header=FALSE);

    error:
    Fehler in read.table(file = "/dev/stdin", header = FALSE) :
    keine Zeilen im Input verfügbar

    in english: no lines in input available

    Was ich aber hart finde ... auf dem mac scheint alles zu laufen:
    Mac Snow leopard

    test.py:

    for i in range(10):
    print(str(i) + "," + str(i**2))

    go.R:

    print("hello")
    dd<-read.table(file="/dev/stdin", header=F, sep=",")
    print(dd)
    print("goodbye")

    command:

    python test.py | R --slave --file="go.R"

    output:

    [1] "hello"
    V1 V2
    1 0 0
    2 1 1
    3 2 4
    4 3 9
    5 4 16
    6 5 25
    7 6 36
    8 7 49
    9 8 64
    10 9 81
    [1] "goodbye"

    mach ich was falsch??



  • kann jmd mal den von mir geposteten code testen und mir sagen iobs geklappt hat oder nicht?

    Falls jmd einen Fehler entdeckt bitte auch sagen

    (bitte OS , architektur angeben)



  • Dein Problem ist, dass du STDIN auf dein R-Script umbiegst:

    tom@blulap:~$ man R | grep -e --file -A 1
           -f, --file=FILE
                  Take input from 'FILE'
    

    Wenn du beim Aufruf STDIN sowieso haendisch auf test.R umbiest ("R --slave < test.R"), hast du das gleiche Problem. Das ist relativ laestig.

    Was auf jeden Fall geht, ist, das Python-Script innerhalb von R via einer Pipe einzulesen:

    read.table(pipe("python test.py"), sep=",")
    

    Die andere Moeglichkeit ist, das Ganze uber "file(stdin)" zu oeffnen (Schau dir in ?stdin mal den Unterschied zwischen stdin() und file(stdin) an: das eine ist die R-Console, das andere das C-STDIN:

    tom@blulap:~$ cat test.py
    for i in range(10):
    	print(str(i) + ", " + str(i**2))
    tom@blulap:~$ cat test.R
    read.table(file = file("stdin"), sep=","); 
    tom@blulap:~$ python test.py | Rscript test.R
       V1 V2
    1   0  0
    2   1  1
    3   2  4
    4   3  9
    5   4 16
    6   5 25
    7   6 36
    8   7 49
    9   8 64
    10  9 81
    

    (statt Rscript kannst du auch "R --slave --file=test.R" verwenden)

    (Das Ganze hat mich uebrigens grad mal 10 Minuten man-pages und R-Hilfsseiten lesen gekostet, naechstes mal: RTFM, bitte 😉 )



  • Ich bedanke mich nun erst einmal, allerdings hab ich den Unterschied zwischen den verschiedenen stdin´s immer noch nicht kapiert.

    (statt Rscript kannst du auch "R --slave --file=test.R" verwenden)

    also das denke ich, habe ich bisher schon getan... siehe 2 Posts weiter oben.

    Aber zu den Stdins. Ich hab jetzt irgendwie 3 Stück im Kopf.

    1. "/dev/stdin"
    2. "stdin"
    3. stdin()

    Also das dritte sollte die R-Funktion sein, welche es mir erlaubt Zeilen in die R-Konsole einzugeben. (1: blubb 0 ...)

    Das zweite muss irgendwie das gewesen sein, dass von CSTDIN kommt, oder?
    schließlich landet hier ja der Code, den ich haben will.

    Was aber habe ich dann mit "/dev/stdin" angegeben? Das sollte doch auch ein Link auf die Konsolenausgabe sein?!

    Falls du mir das erklären möchtest, darfst du das gerne. Ich versuche es natürlich auch herauszufinden.
    ( Bei mir müsste es statt RTFM eher UTFM - understand the fucking manual heißen ^^)



  • gote schrieb:

    Aber zu den Stdins. Ich hab jetzt irgendwie 3 Stück im Kopf.

    1. "/dev/stdin"
    2. "stdin"
    3. stdin()

    Also das dritte sollte die R-Funktion sein, welche es mir erlaubt Zeilen in die R-Konsole einzugeben. (1: blubb 0 ...)

    Das zweite muss irgendwie das gewesen sein, dass von CSTDIN kommt, oder?
    schließlich landet hier ja der Code, den ich haben will.

    Was aber habe ich dann mit "/dev/stdin" angegeben? Das sollte doch auch ein Link auf die Konsolenausgabe sein?!

    Na ja, zunaechst mal: ich bin mir auch nicht 100%ig sicher, wo der Unterschied liegt, was genau die R Console ist, wird in der Hilfe sehr schlecht erklaert. Ich hab mir nur gedacht "ok, da gibts nen Unterschied, probieren wir mal beide Methoden aus".

    /dev/stdin ist ein spezielles File deines Betriebssystems (und funktioniert nur auf Unixoiden Systemen , auf Windows gibts die Datei nicht). Damit machst du die Datei /dev/stdin auf (das ist ein Device File). Das sollte eigentlich das selbe sein wie das CSTDIN (sprich der Ort, von dem cin und scanf lesen). Warum es in diesem Fall nicht gleich funktioniert wie `file="stdin"`ist mir allerdings auch schleierhaft. 😕


Anmelden zum Antworten