2013-03-14 37 views
9

Có cách nào để gọi chức năng định nghĩa trong một tập tin nói myfunc.rGọi chức năng Custom từ Python sử dụng 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 ? 

Bất kỳ trợ giúp sẽ được đánh giá cao?

+0

Tại sao bạn xác định 'myfunc' ở đây? – agstudy

+0

@agstudy: chỉ là một ví dụ cho thấy tệp có thể chứa một số hàm, tôi nghĩ vậy. – lgautier

Trả lời

8

Bạn có thể làm một cái gì đó như thế này (mã python đây)

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

r_getname = robjects.globalenv['getname'] 

sau đó bạn gọi nó là

r_getname() 
+0

Điều này vẫn làm việc cho tôi trong năm 2016 với 'R-3.2.2' và' rpy2 = 2.7.0' :) –

11

Các là các tính năng trong rpy2 rằng sẽ giúp làm này sạch hơn bán phá giá đối tượng vào toàn cầu không gian làm việc.

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") 

Hiện tại, đối tượng trong tệp R có thể được truy cập với myfunc.myfuncmyfunc.getname.

Kiểm tra tài liệu về importing arbitrary R code as a package (tài liệu cũ here).

+0

'SignatureTranslatedAnonymousPackage' Tên là một chút dài tôi nghĩ .. cho R và python develoopers :) – agstudy

+0

Có , có thể nằm trên đầu lộng lẫy Java của phổ đặt tên nhưng vẫn dưới 140 ký tự ;-). Một tên lớp ngắn hơn trong khi giữ nó rõ ràng sẽ có nghĩa là giới thiệu một gói con. Đề xuất cho tên cũng được chào đón. – lgautier

+0

Tất nhiên tôi đến từ thế giới .net và tôi biết ý bạn là gì. rpy2 là một công việc tuyệt vời. Tôi đánh giá cao. +1 .. tên dài nhưng giải pháp sạch sẽ! Tôi nghĩ bạn chỉ có thể thêm 'Import SignatureTranslatedAnonymousPackage thành STAP' chẳng hạn ... – agstudy

1

tôi muốn đề nghị sử dụng những gì user3282437 gợi ý here:

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

Tôi không chắc chắn rằng đó là một vấn đề toàn cầu, nhưng trên Windows máy gọi trực tiếp của tôi như agstudy khuyên:

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

dẫn đến sự cố trăn.

Các vấn đề liên quan