2012-03-05 5 views
11

मैं किसी ऑब्जेक्ट में किसी ऑब्जेक्ट में असाइन मानों का उपयोग करने का प्रयास कर रहा हूं। मैं क्या करना चाहता हूं कुछ तत्वों को बदलना है। उदाहरण के लिए:क्यों आर में एक सूची तत्व काम करने के लिए मान आवंटित नहीं करता है?

x <- list() 
x$test <- 1 
assign("x$test", 2) 
x$test == 1 
    [1] TRUE 

कोई विचार? मुझे असाइनमेंट का उपयोग करने की आवश्यकता है क्योंकि मैं एक फ़ंक्शन बना रहा हूं जो सूची (x) के भीतर ऑब्जेक्ट्स के नाम इनपुट के रूप में ले जाएगा।

+0

नोट 'x $ test' और' x [['test']] 'के बीच एक बड़ा अंतर है। ['निकालें (..., ड्रॉप = TRUE) 'पर दस्तावेज़ देखें [https://stat.ethz.ch/R-manual/R-devel/library/base/html/Extract.html) – smci

उत्तर

13

ऐसा लगता है कि आप भाग्य से बाहर हैं। मदद फ़ाइल से:

'असाइन' असाइनमेंट तरीकों प्रेषण नहीं करता है, तो यह एक संलग्न सूची में वैक्टर, नाम, गुण की सेट तत्वों, आदि

ध्यान दें कि काम करने के लिए इस्तेमाल नहीं किया जा सकता या डेटा फ्रेम संलग्न प्रतिलिपि को बदलता है और मूल वस्तु नहीं: 'संलग्न' और 'साथ' देखें।

आप names(x) इनपुट के रूप में गुजर रहे हैं, तो आप उपयोग नहीं कर सका:

nms <- names(x) 
for (n in nms) 
    x[[n]] <- 'new_value' 

इसके अलावा, आप अपने कार्य कुछ वैश्विक चर को संशोधित करने के लिए इच्छुक रहे हैं? उदाहरण:

x <- list(test=1) 

f <- function(...) 
    x$test <- 2 

f() # want x$test = 2 ?? 

क्योंकि यह काम नहीं करेगा (गुंजाइश समस्याएं)। आप इसे कुछ फुटवर्क (<<-) के साथ काम कर सकते हैं, लेकिन इसे आम तौर पर खराब अभ्यास माना जाता है क्योंकि आपके कोड में अनजाने बग को intrtoduce करना आसान है।

यदि आप यह उदाहरण दे सकते हैं कि आप यह फ़ंक्शन क्यों चाहते हैं/यह किस उद्देश्य से सेवा करेगा, तो हम आपको वैकल्पिक समाधान खोजने में मदद कर सकते हैं।

+0

ग्रेट, बहुत बहुत धन्यवाद - मुझे पता नहीं था कि मैं [[n]] वाक्यविन्यास का उपयोग कर सकता हूं, जो पूरी तरह से पर्याप्त है। वास्तव में जानकारी की सराहना करते हैं। – mike

8

देखें क्या है जब आप करने के लिए "एक्स $ परीक्षण" आवंटित होता है:

x <- list() 
x$test <- 1 
assign("x$test", 2) 
ls() 
[1] "x"  "x$test" 

तत्व "परीक्षण" "x" में अभी भी 1 है, और आप x$test के साथ निकालने लेकिन get("x$test") मान 2 हो जाएगा उस नाम से।

क्यों न सिर्फ नामों का उपयोग करें? अर्थात।

this.name <- "test" 
x[[this.name]] <- 2 
+0

मुझे नहीं पता कि दूसरा जवाब क्यों स्वीकार कर लिया गया है, लेकिन जैसा कि mdsumner कहते हैं, सीधे नाम का उपयोग क्यों नहीं करते? यह बिल्कुल निर्दोष काम करता है। – user1052080

+0

असाइन करें() आपको उस वातावरण को निर्दिष्ट करने की अनुमति देता है जिसमें असाइनमेंट होता है, जो बहुत उपयोगी हो सकता है। यह << के विपरीत है - जो केवल वैश्विक पर्यावरण को असाइन करता है। तो, x [[name]] असाइनमेंट के रूप में सामान्य समाधान नहीं है (x $ name, value, envir = my_env) होगा। –

1

आप < < की कोशिश की है -? मैंने कल पोस्ट में किसी फ़ंक्शन के भीतर से किसी सूची में नामों और मानों को असाइन करने के लिए इसका उपयोग किया था ("Combine a series of data frames and create new columns for data in each" देखें)।

+0

मुझे लगता है कि गणितीय कॉफी ने पहले ही यह सुझाव दिया है। –

1

एक अन्य समाधान है:

x <- list() 
x$test <- 1 
assign("x$test", 2) 
x$test == 1 
TRUE 
eval(parse(text="x$test<-2")) 
x$test == 1 
FALSE 

eval(parse(text="")) आदेश इस संदर्भ में बहुत उपयोगी हो सकता है।

ईमानदारी से

+4

थॉमस लुमली को पारदर्शी करने के लिए: "अगर जवाब पार्स है() तो आपको आमतौर पर प्रश्न पर पुनर्विचार करना चाहिए।" यदि कोई अधिक समझदार समाधान है तो हर समय इस तरह की संरचनाओं से बचें। यहां वह समाधान है [['' –

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