2013-01-14 19 views
6

मैं एक गैर नेस्टेड सूची (सुंदर सीधे आगे) नहाना बदलें। कुछ तत्व एनएएस हैं लेकिन एक ही सूची के अन्य तत्वों के साथ प्रतिस्थापित किया जा सकता है। मैं इसे वैश्विक असाइनमेंट ऑपरेटर <<- के साथ प्राप्त कर सकता हूं। हालांकि मैं बेहतर अभ्यास सीखने के लिए (यह मेरे notes देने के लिए जब क्रैन के लिए एक पैकेज संकलन प्रकट होता है के रूप में) कोशिश कर रहा हूँ। प्रश्न:सूची तत्वों (वैश्विक काम से बचने)

  1. क्या मैं इसे वैश्विक असाइनमेंट के बिना प्राप्त कर सकता हूं?
  2. यदि नहीं मैं कैसे उपयोग कर सकते हैं assign उचित रूप से (मेरे दृष्टिकोण एक ही डेटा सेट की प्रतियां का एक समूह बनाने के लिए लगता है और स्मृति में समस्याएं आ रही हो सकता है)।

मैं असाइन की कोशिश की है और यह काम नहीं करता। मैं भी वैश्विक काम के बिना lapply का उपयोग करने की कोशिश की, लेकिन मैं केवल पिछले तत्व प्रत्येक तत्व की जगह के साथ सूची के बजाय लौटे मिल सकती है।

यहाँ समस्या है:

#Fake Data 
L1 <- lapply(1:3, function(i) rnorm(1)) 
L1[4:5] <- NA 
names(L1) <- letters[1:5] 

#items to replace and their replacements (names of elements to replace) 
nulls <- names(L1[sapply(L1, function(x) is.na(x))]) 
replaces <- c("b", "a") 

#doesn't work (returns only last element) 
lapply(seq_along(nulls), function(i) { 
    L1[[nulls[i]]] <- L1[[replaces[i]]] 
    return(L1) 
}) 

#works but considered bad practice by many 
lapply(seq_along(nulls), function(i) { 
    L1[[nulls[i]]] <<- L1[[replaces[i]]] 
}) 

#does not work (I try L1[["d"]] and still get NA) 
lapply(seq_along(nulls), function(i) { 
    assign(paste0("L1[[", nulls[i], "]]"), L1[[replaces[i]]], envir = .GlobalEnv) 
}) 

#also bad practice bu I tried 
lapply(seq_along(nulls), function(i) { 
    assign(paste0("L1$", nulls[i]), L1[[replaces[i]]], envir = .GlobalEnv) 
}) 

#This works but it feels like we're making a ton of copies of the same data set 
lapply(seq_along(nulls), function(i) { 
    L1[[nulls[i]]] <- L1[[replaces[i]]] 
    assign("L1", L1, envir = .GlobalEnv) 
}) 

अंत में, मैं वैश्विक काम के बिना यह कर करना चाहते हैं, लेकिन अगर ऐसा नहीं है कि क्या क्रैन के लिए एक एक पैकेज के निर्माण के लिए सबसे अच्छा अभ्यास है।

replace(L1, match(nulls, names(L1)), L1[match(replaces, names(L1))]) 

तुम भी थोड़ा सरल which(is.na(L1)) इस्तेमाल कर सकते हैं, match(nulls, names(L1))

+1

आप क्यों नहीं बनाते एक वेक्टर सूची टी? – Roland

+1

'lapply' +' << - 'आम तौर पर अर्थ है आप पाश के लिए एक का उपयोग करना चाहिए। – hadley

+0

@ हडली, उपयोगी जानकारी। मैं शर्त लगा रहा हूं कि यह मेरे पैकेज निर्माण पर प्राप्त होने वाले कुछ नोट्स से छुटकारा पा सकता है। –

उत्तर

10

वहाँ एक replace समारोह है कि आप के लिए यह करना होगा है परिस्थितियों का उपयोग replace:

for(i in seq_along(a[!apps])){ 
    L1[[nulls[i]]] <- L1[[replaces[i]]] 
} 
4

की पूर्णता के लिए यहां के बजाय कुछ इसी तरह के रूप में पाश के लिए एक का हैडली के सुझाव है:

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