2013-03-14 6 views
9

Gibt es eine Möglichkeit Funktionen in einer Datei definiert nennen sagen myfunc.rAufrufe von benutzerdefinierten Funktionen aus Python mit rpy2

---------------myfunc.r -------------- 
myfunc = function(){ 
    return(c(1,2,3,4,5,6,7,8,9,10)) 
} 

getname = function(){ 
    return("chart title") 
} 

---- Python 
    How to call getname() here ? 

Jede Hilfe wäre sehr geschätzt werden?

+0

Warum definieren Sie 'myfunc' hier? – agstudy

+0

@agstudy: nur ein Beispiel zeigt, dass die Datei mehrere Funktionen enthalten kann, denke ich. – lgautier

Antwort

8

Sie können so etwas wie dieses (hier Python-Code) tun

import rpy2.robjects as robjects 
robjects.r(''' 
     source('myfunc.r') 
''') 

r_getname = robjects.globalenv['getname'] 

dann rufen Sie es

r_getname() 
+0

Dies funktionierte für mich noch 2016 mit 'R-3.2.2' und' rpy2 = 2.7.0' :) –

11

Das sind Funktionen in rpy2, die dabei helfen sollten machen sauberer als Objekte in den globalen Dumping Arbeitsplatz.

from rpy2.robjects.packages import STAP 
# if rpy2 < 2.6.1 do: 
# from rpy2.robjects.packages import SignatureTranslatedAnonymousPackage 
# STAP = SignatureTranslatedAnonymousPackage 
with open('myfunc.r', 'r') as f: 
    string = f.read() 
myfunc = STAP(string, "myfunc") 

Die Objekte in der R-Datei kann nun mit myfunc.myfunc und myfunc.getname zugegriffen werden.

Überprüfen Sie die Dokumentation über importing arbitrary R code as a package (ältere doc here).

+0

'SignatureTranslatedAnonymousPackage' Der Name ist ein bisschen lang Ich denke..für R und Python Entwickler :) – agstudy

+0

Ja , kann auf dem Java-Extravaganz Ende des Namensspektrums aber noch unter 140 Zeichen sein ;-). Ein kürzerer Klassenname würde bei gleichzeitiger Klarstellung ein Unterpaket einführen. Vorschläge für Namen sind ebenfalls willkommen. – lgautier

+0

Natürlich kam ich aus der .net Welt und ich weiß was du meinst. rpy2 ist eine großartige Arbeit. Ich schätze. +1 .. langer Name aber saubere Lösung! Ich denke, Sie können einfach 'import SignatureTranslatedAnonymousPackage als STAP' zum Beispiel hinzufügen ... – agstudy

1

Ich würde vorschlagen, zu verwenden, was user3282437here vorgeschlagen:

import rpy2.robjects as robjects 
r_source = robjects.r['source'] 
r_source('/path_to_file/myfunc.R') 
r_getname = robjects.globalenv['getname'] 

Ich bin nicht sicher, dass es sich um ein globales Problem ist, aber auf meinem Windows-Rechner direkten Aufruf wie agstudy geraten:

import rpy2.robjects as robjects 
robjects.r('source("some_file.R")') 

führt zu Python-Absturz.