2012-09-05 8 views
5

this post से मुझे एक स्क्रिप्ट मिली है जो एक एक्सेल फ़ाइल (नीचे कोड) में अलग वर्कशीट के रूप में एक सूची निर्यात करती है। अब मैं इसे इनपुट सूची नाम और आउटपुट फ़ाइल नाम प्रदान करके इस व्यवहार को पुन: उत्पन्न करने के लिए एक सुविधाजनक फ़ंक्शन में लपेटना चाहता हूं।अलग-अलग एक्सेल वर्कशीट्स में आर सूची को सहेजने के लिए फ़ंक्शन

नमूना डेटा:

var1 <- list('2003' = 1:3, '2004' = c(4:3), '2005' = c(6,4,1), '2006' = 1:4) 

वर्तमान स्क्रिप्ट:

require("XLConnect") 
wb <- loadWorkbook("var1.xlsx", create = TRUE) 
createSheet(wb, names(var1)) 
writeWorksheet(wb, var1, names(var1),header=FALSE) 
saveWorkbook(wb) 

अस्वीकरण:मैं इस तरह के एक सरल सवाल पूछने के लिए लज्जित करते हुए मैं कर रहा हूँ यकीन है कि कई अन्य आगंतुकों इसलिए इस जानकारी को यहां ढूंढना अच्छा लगेगा; 7)

संपादित :: रेडी-टू-उपयोग समारोह:

save.excel <-function(.list, default = 'var1', path = ''){ 
    require("XLConnect") 
    .name <- as.list(match.call())[2] 
    if(is.language(.name[[1]])) wb_name <- paste0(paste0(path, default, collapse = '/'), '.xlsx') 
    if(is.symbol(.name[[1]])) wb_name <- paste0(paste0(path, as.character(.name), collapse = '/'), '.xlsx') 
    wb <- loadWorkbook(wb_name, create = TRUE) 
    createSheet(wb, names(.list)) 
    writeWorksheet(wb,.list, names(.list),header=FALSE) 
    saveWorkbook(wb) 
    } 

नीचे समाधान से फर्क सिर्फ इतना है कि मैं, एक पुस्तकालय समारोह अंदर से अनुरोध किया XLConnect जोड़ा मामले में आप नहीं किया है इसे मैन्युअल रूप से पहले करें; 7)

+0

आपके उदाहरण कोड में कोई डेटा.फ्रेम नहीं है, बस एक नामित सूची – mnel

+0

क्या आपने 'writeNamedRegion' – mnel

+0

@mnel के लिए सहायता फ़ाइल पढ़ी है, धन्यवाद। लगातार 2 दिनों में दूसरी बार मैं उस टाइपो को बना देता हूं। ** ब्लश ** – dmvianna

उत्तर

6

यह अनचाहे है, क्योंकि XLConnect मेरी मशीन पर स्थापित नहीं होगा। लेकिन निम्नलिखित की तरह कुछ

सरल दृष्टिकोण काम हो सकता है

एक समारोह दो तर्क

  • my_list साथ - सूची है जो आप के रूप में अलग कार्यपत्रक
  • wb_name के तत्वों निर्यात करना चाहते - के नाम कार्यपुस्तिका

फ़ंक्शन इस

जैसा दिखता है
write_list <-function(my_list, wb_name = 'var1.xlsx') {  
    wb <- loadWorkbook(wb_name, create = TRUE) 
    createSheet(wb, names(my_list)) 
    writeWorksheet(wb, my_list, names(my_list),header=FALSE) 
    saveWorkbook(wb) 
} 

फैंसी विकल्प है कि सूची

के नाम का उपयोग करेगा आप तो आप match.call, is.symbol और is.language साथ मजा कर सकते list के नाम का उपयोग करने के लिए फ़ाइल बनाने के लिए चाहते हैं। क्यों आप ऐसा करते हैं का विवरण नीचे

write_list_name <-function(.list, default = 'var1', path = ''){ 
    .name <- as.list(match.call())[2] 
    if(is.language(.name[[1]])){ 
    wb_name <- sprintf("%s/%s.xlsx", path, default) 
    } 
    if(is.symbol(.name[[1]])) { 
    wb_name <- sprintf("%s/%s.xlsx", path, as.character(.name)) 
    } 
    wb <- loadWorkbook(wb_name, create = TRUE) 
    createSheet(wb, names(.list)) 
    writeWorksheet(wb,.list, names(.list),header=FALSE) 
    saveWorkbook(wb) 
    } 

is.language/is.symbol/match.call सौदा कर रहे हैं दो स्थितियों

write_list_name(var1) 

#in which case .name[[1]] is the symbol var1 

और

write_list_name(list(n=2:3)) 
# in which case .name[[1]] is list(n=2:3), and class language 
# a file called list(n=2:3).xlsx would be not ideal, hence the `default` argument. 
+1

ऑब्जेक्ट नाम (यदि संभव हो) से वर्कशीट का नाम घटाकर, आईपीओ ओपी की समस्या से कुछ परेशान करता है। एक अधिक सरल, और चित्रकारी आईएमओ में, उदाहरण के लिए उपयोगकर्ता xlsx फ़ाइल का नाम निर्दिष्ट कर सकता है, यानी 'wb_name' को तर्क के रूप में उपयोग करें। –

+1

इसके अतिरिक्त, आप एकल 'पेस्ट 0' कोड को एकल कॉल द्वारा 'sprintf' में बदल सकते हैं: उदा। 'sprintf ("% s /% s.xlsx ", पथ, डिफ़ॉल्ट)'। –

+0

हां, शायद यह लिली को हल कर रहा है या हलवा को अंडा कर रहा है (उचित मुहावरे को ढूंढें)। मैंने जवाब – mnel

2

@mnel के समाधान के अलावा के साथ, यहां कार्यों के बारे में कुछ सामान्य जानकारी दी गई है।

function_name = function(input_a, input_b) { 
    c = input_a * 2 
    d = do_something(input_b) 
    return(list(c, d)) 
} 

जहां input_a, और input_b इनपुट तर्क हैं, और list(c, d) वापसी मान है:

सामान्य तौर पर, एक समारोह कुछ इस तरह लग रहा है।

out_a = function_name(a, b) 

ध्यान दें कि function_name, a और b के समारोह शरीर में input_a और input_b की जगह: यह वापसी मान वस्तु जो = के बाएं हाथ की ओर है जब फ़ंक्शन को कॉल करने के लिए आवंटित किया गया है। तथ्य यह है कि ainput_a से जुड़ा हुआ है तर्कों के क्रम के आधार पर किया जाता है। वैकल्पिक रूप से, एक का नाम का उपयोग कर सकते तर्क:

out_a = function(input_a = a, input_b = b) 

यह विशेष रूप से अच्छी तरह से चुना समारोह और तर्क नाम के लिए समारोह कॉल मेरी राय में अधिक पठनीय बनाता है।

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