आर एक्सटेंशन: एक पैकेज के भीतर बाहरी स्क्रिप्ट को कॉल करना - php, r

मैं एक आर पैकेज लिख रहा हूं जो कि दूसरे के बीच हैचीजें, एक फ़ंक्शन को परिभाषित करती हैं जो वास्तव में एक PHP स्क्रिप्ट के लिए एक रैपर है। आइए मान लें कि PHP स्क्रिप्ट कुछ कार्यक्षमता प्रदान करती है जो आर में पुन: निर्माण करना काफी कठिन है और तर्क की मेरी रेखा (आर में एक PHP स्क्रिप्ट लपेटना) समझ में आता है।

मैं वर्तमान में PHP स्क्रिप्ट को एक अलग फ़ाइल में रख रहा हूं, और इसे सिस्टम कॉल के माध्यम से चला रहा हूं।

मेरा आर समारोह / रैपर इस तरह दिखता है:

wrapper <- function() {

# I"m not entirely sure what the path to the PHP file should be
php_file_name <- "magic_in.php"
php_script_argument <- "hello, world"

system_call <- sprintf("php -f "%s"", php_file_name, php_script_argument)
system(system_call)

}

जबकि magic_in.php फ़ाइल निम्न है:

<?php

print($argv[1]."n")

?>

लेकिन यह समाधान बेकार है - सिस्टम कॉल केवल तभी काम करता है जब मेरे पास मेरी वर्तमान कार्यशील निर्देशिका में PHP स्क्रिप्ट है।

मैं रैपर को ए में रखता हूं ~/simple_package/R/wrapper.R फ़ाइल, लेकिन मुझे यकीन नहीं है कि PHP स्क्रिप्ट को कहां स्टोर करना है।

क्या मुझे PHP फ़ाइल को एक में रखना चाहिए ~/simple_package/src निर्देशिका और फिर कुछ समर्पित आर समारोह (जैसे .Call सी निष्पादन योग्य के लिए)?

उत्तर:

जवाब के लिए 0 № 1

शायद /data पैकेज स्क्रिप्ट के लिए सबसे अच्छा विकल्प नहीं है, /exec एक बेहतर विकल्प हो सकता है।

देख:

आप भी उपयोग करने पर विचार कर सकते हैं system2:

कुछ भाषाओं (पायथन) के लिए, सीआरएएन में कुछ विशेष समर्थन है


एक उदाहरण (का उपयोग कर system तथा system.file):

इसे एक द्वारा निष्पादित किया जाता है बाहरी आर स्क्रिप्ट कमांड लाइन:

#!/bin/env Rscript

args <- commandArgs(TRUE)
if( length(args) < 2 ){
stop( "usage : R CMD execute package script [parameters]n" )
}
package <- args[1]
script <- args[2]
scriptfile <- file.path( system.file( "exec", script, package = package ) ) # <= path
if( !file.exists( scriptfile ) ){
stop( sprintf( "file not found: "%s" ", scriptfile  ) )
}

trail <- if( length(args) > 2 ) paste( tail( args, -2 ), sep = " " ) else ""
cmd <- sprintf( ""%s" %s", scriptfile, trail )

system( cmd ) # <= or system2 ...

जवाब के लिए 0 № 2

ऐसा करने के कई तरीके हैं। आप फ़ंक्शन में फ़ंक्शन को हार्ड-कोड कर सकते हैं, इसे फ़ाइल में लिख सकते हैं, इसे फ़ंक्शन के माध्यम से चला सकते हैं wrapper तर्क के साथ (जब आप फ़ाइल बनाते हैं तो पथ अंतर्निहित होता है) और बाद में साफ़ करें।

एक बेहतर दृष्टिकोण शायद स्क्रिप्ट को रखना होगा /data और इसे के माध्यम से बुलाओ ?system.file


संबंधित सवाल
सबसे लोकप्रिय