2011-08-04 17 views
5

के माध्यम से php से एक सरणी पास करना मुझे कोई समस्या है, मैं कमांड लाइन के माध्यम से php से आर स्क्रिप्ट निष्पादित कर रहा हूं, और मुझे इसे गणना के लिए दो सरणी देने की आवश्यकता है।कमांड लाइन से आर

मैं चलाकर स्क्रिप्ट फोन:

Rscript nls.R ??? ??? 

??? तथा ??? मेरे सरणी हैं कि मुझे कुछ मूल्यों की गणना करने के लिए आर को "देने" की आवश्यकता है।

कोई भी जानता है कि यह कैसे करें? यह php तक सीमित नहीं है, क्योंकि यह कमांड लाइन है - मुझे बस यह जानने की ज़रूरत है कि कमांड लाइन के माध्यम से आर को एक सरणी पास की जा सकती है या नहीं।

आर कैसे इसे पकड़ेंगे, किस आदेश के साथ?

बहुत बहुत धन्यवाद।

सादर

+1

नोट: कैसे आप PHP से Rscript निष्पादित, सुरक्षा संबंधी दोषों के लिए बाहर देखने अगर तर्क वेब उपयोगकर्ता से आते हैं पारित पर निर्भर करता है। – Spacedman

उत्तर

4

आदेश आप देख रहे हैं commandArgs() है।

अब, आप उदाहरण के लिए एक सूची है अगर एक स्ट्रिंग में अल्पविराम के द्वारा अलग पूर्णांकों, आप पूर्णांक प्राप्त कर सकते हैं

s = '1,2,3,4,5' 
your_list = lapply(strsplit(s, ','), as.numeric)[[1]] 

वहाँ सीधी-सपाट इसे प्राप्त करने तरीके हो सकते हैं।

संपादित करें:

बेहतर उदाहरण है (यह भी Rscript साथ काम करना चाहिए)

$ R "1,2,3,4,5" 
... 

>lapply(strsplit(commandArgs()[[2]], ','), as.numeric)[[1]] 
[1] 1 2 3 4 5 
+0

यह काम कर देता है क्योंकि सरणियों छोटे हैं, तो मैं एक स्ट्रिंग के लिए उन्हें concatinated और फिर उन्हें आर धन्यवाद, हर किसी में reparsed! – Nemanja

2

आप Rscript को ऐसी बातें (अच्छी तरह से, आसानी से नहीं) पारित नहीं कर सकते हैं। Rscript में -e विकल्प है, जिसमें से एक से अधिक हो सकते हैं, जो आर अभिव्यक्तियां हैं। तो आप एक वर्ण स्ट्रिंग का उत्पादन करने के लिए PHP प्राप्त कर सकते हैं जो एक आर अभिव्यक्ति है जो आपके सरणी बना रही है, और अलग-अलग -e तर्कों के माध्यम से एक सरणी बनाने के लिए प्रत्येक अभिव्यक्ति को पास करती है।

आप कमांड लाइन तर्कों में भी पास कर सकते हैं कि आर फ़ंक्शन commandArgs() आपके लिए पकड़ और उपलब्ध करा सकता है। उदाहरण here देखें, लेकिन आपको आर

द्वारा तर्कों को पारित करने और मूल्यांकन करने के तरीके के साथ खेलना पड़ सकता है, सरणी के आकार के आधार पर, ऊपर से अधिक संभावना उपयोगी नहीं होगी। इस मामले में आपको Rscript के माध्यम से आर के साथ संवाद करने के अन्य तरीकों को देखना होगा।

+0

अपनी खुद की स्क्रिप्ट के साथ संयोजन में -ई विकल्प का उपयोग करना मुश्किल है। एक कार्यशील निर्देशिका सेट करना और स्क्रिप्ट का उपयोग करके स्क्रिप्ट को सोर्स करना सीधे आगे नहीं है ... –

3

आपको अपनी आर स्क्रिप्ट को अनुकूलित करना होगा और commandArgs() पर कॉल शामिल करना होगा। जब trailingOnly=TRUE विकल्प के साथ उपयोग किया जाता है, तो यह कॉल के बाद स्पेस से अलग तर्कों के साथ एक चरित्र वेक्टर वापस कर देगा। यह आपको तर्कों को आगे बढ़ाने में मदद करेगा।

को देखते हुए एक स्क्रिप्ट myscript.r:

#My script 
x <- commandArgs(trailingOnly=TRUE) 
print(x) 
print(str(x)) 

आप कमांड लाइन Rscript myscript.r 1 2 3 से फोन करके प्राप्त

Loading required package: ... 
... 
[1] "1" "2" "3" 
chr[1:3] "1" "2" "3" 
NULL 

F:\Temp 

यह आपको करने के लिए अपने सरणियों के साथ पाठ फ़ाइलों के नाम पारित करने के लिए संभावना प्रदान करता है सकते हैं प्रतिलेखयदि मैं अलग-अलग भाषाओं को जोड़ता हूं, तो मैं आमतौर पर इंटरमीडिएट परिणामों को सहेजने के लिए टेक्स्ट फाइलों का उपयोग करता हूं, इससे चीजें थोड़ा अधिक चिकनी हो जाती हैं।

खबरदार, अगर आप Rscript के विकल्पों में से किसी का उपयोग (जैसे --no-बचाने के लिए), तो आप उन्हें स्क्रिप्ट से पहले डाल करने के लिए है, जैसे Rscript --no-save myscript.r

4

मान लिया जाये कि आप की सेवा करने की एक प्रक्रिया में अनुसंधान चलाना चाहते हैं एक वेब पेज, कमांड लाइन से आर को आमंत्रित करने के कुछ बेहतर तरीके हैं; समस्या यह है कि आर दुभाषिया बहुत धीमी गति से शुरू होता है और आप समय और CPU शक्ति की बहुत सारी बर्बाद कर रहे इस पर शुरू करने और फिर से करने के लिए है।

आप उदाहरण के लिए triggr साथ एक छोटी सी आर सर्वर बनाने के लिए और पीएचपी सॉकेट के साथ किए गए एक ग्राहक का उपयोग कर इसे से बात कर सकते हैं।
सरल अभी तक भारी विचार कर्ल के साथ यह करने के लिए एक rApache एप्लिकेशन और या तो बात कर सकते हैं या AJAX या यहाँ तक कि एचटीएमएल प्रदाता के रूप में सीधे इसका इस्तेमाल करने की है।

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