2012-07-24 15 views
5

कुछ दिनों पहले इंटरनेट पर इस तरह की खोज करने के बाद, मैं अभी भी इस समस्या का वर्णन करने में कुछ भी ढूंढ नहीं पाया। (अन्यथा काफी अनुशंसित) 'लेखन आर एक्सटेंशन' के माध्यम से पढ़ना एक समाधान भी प्रदान नहीं करता है। इस प्रकार, यहाँ मेरी सबसे जरूरी सवाल है:आर में फोरिंग फ़ंक्शन के रूप में। फोर्ट्रान तर्क

क्या यह संभव है कार्यों पारित करने के लिए - समारोह/सबरूटीन मापदंडों .Fortran के माध्यम से फोरट्रान के रूप में ((सादगी की खातिर, एक सरल आर समारोह मान वास्तविकता में, समस्या भी भद्दा है)। ..) कॉल - और यदि हां, तो कैसे?

subroutine foo(o, x) 
    implicit none 

    interface 
     subroutine o(t, y, param, f) 
      double precision, intent(in) :: t 
      double precision, dimension(58), intent(in) :: y, param 
      double precision, dimension(22), intent(out) :: f 
     end subroutine 
    end interface 

    double precision, dimension(22), intent(out) :: x 

    double precision, dimension(58) :: yt, paramt 
    integer :: i 

    do i = 1, 58 
     yt(i) = rand(0) 
     paramt(i) = rand(1) 
    end do 

    call o(dble(4.2), yt, paramt, x) 
end subroutine 

और एक:

मैं आदेश में इस पहले एक फोरट्रान सबरूटीन (समारोह मैं मूल रूप से पारित करने का इरादा है, इस प्रकार इंटरफ़ेस में थोड़े अजीब आयामों का उपयोग के आधार पर) का परीक्षण करने, में दो साधारण कार्यों लिखा था सरल आर समारोह ऊपर कार्य करने के लिए पारित करने के लिए:

asdf <- function(a, s, d, f){x <- c(a, s, d, f)} 

एक segfault में (एक स्ट्रिंग के रूप में) "asdf" गुजर परिणाम .Fortran("foo", asdf, vector(mode="numeric", length=22)) पैदावार Error: invalid mode (closure) to pass to Fortran (arg 1) और कॉलिंग, के रूप में तर्क स्पष्ट रूप से फिट नहीं करता है अपेक्षित प्रकार (अर्थात्, एक समारोह)।

एफवाईआई, मुझे उम्मीद है कि कोड कुछ भी सार्थक नहीं करेगा (यह एक और कार्य का कार्य होगा), मैं मुख्य रूप से जानना चाहता हूं कि क्या आर से गुजरने वाले कार्यों (या फ़ंक्शन पॉइंटर्स) बिल्कुल संभव है या गीलेर मैं तुरंत इस दृष्टिकोण पर छोड़ देता हूं और कुछ ऐसा काम करता हूं जो काम कर सकता है।

अग्रिम धन्यवाद,

डीन

उत्तर

2

आप .Fortran के माध्यम से आर वस्तुओं पारित नहीं कर सकते हैं। आर ऑब्जेक्ट्स को सी/सी ++ कोड में पास करने के लिए आपको .Call या .External इंटरफ़ेस का उपयोग करने की आवश्यकता होगी।

आप अपने अनुसंधान समारोह है, जो आप तो अपने फोरट्रान कोड से कह सकते हैं के लिए एक C/C++ आवरण लिख सकता है (लेखन आर एक्सटेंशन में Calling-C-from-FORTRAN-and-vice-versa देखें)।

+0

तो, एक समारोह आर में एक वस्तु के रूप में माना जाता है? – DStevens

+0

हां, एक एसईएक्सपी ऑब्जेक्ट, और उदाहरण के लिए आरसीपीपी में हम इसे फ़ंक्शन को पास करने में बहुत आसान बनाते हैं। –

+0

@DirkEddelbuettel: क्या आपके पास फोर्ट्रान को कॉल करने के लिए कोई फैंसी आरसीपीपी सामान है, या फोर्ट्रान आरसीपीपी भूमि में सी के रूप में verboten के रूप में है? ;-) –

संबंधित मुद्दे