2011-01-17 7 views
46

मेरे पास डीडी नामक एक आर मैट्रिक्स है। जब मैं इस प्रवेश करते हैं, सब कुछ ठीक काम करता है:आर ऑब्जेक्ट्स फ़ंक्शन या "फॉर" लूप में क्यों प्रिंट नहीं करते हैं?

i <- 1 
shapiro.test(ddd[,y]) 
ad.test(ddd[,y]) 
stem(ddd[,y]) 
print(y) 

शापिरो विल्क, एंडरसन डार्लिंग के लिए कॉल, और सब काम स्टेम, और एक ही स्तंभ निकालें।

यदि मैं इस कोड को "फॉर" लूप में डालता हूं, तो शापिरो विल्को की कॉल, और एंडरसन डार्लिंग काम करना बंद कर देते हैं, जबकि स्टेम & पत्ती कॉल और प्रिंट कॉल काम जारी रखती है।

for (y in 7:10) { 
    shapiro.test(ddd[,y]) 
    ad.test(ddd[,y]) 
    stem(ddd[,y]) 
    print(y) 
} 

The decimal point is 1 digit(s) to the right of the | 

    0 | 0 
    0 | 899999 
    1 | 0 

[1] 7 

वही बात होती है यदि मैं कोई फ़ंक्शन कोशिश करता हूं और लिखता हूं। एसडब्ल्यू & एडी काम नहीं करते हैं। अन्य कॉल करते हैं।

> D <- function (y) { 
+ shapiro.test(ddd[,y]) 
+ ad.test(ddd[,y]) 
+ stem(ddd[,y]) 
+ print(y) } 

> D(9) 

    The decimal point is at the | 

    9 | 000 
    9 | 
    10 | 00000 

[1] 9 

सभी कॉल एक ही तरीके से क्यों व्यवहार नहीं करते हैं?

+0

'i' के लिए क्या है - क्या आपका मतलब पहली पंक्ति में 'y <- 1' था? –

उत्तर

50

एक लूप में, स्वचालित प्रिंटिंग बंद है, क्योंकि यह एक फ़ंक्शन के अंदर है। यदि आप आउटपुट देखना चाहते हैं तो आपको दोनों मामलों में कुछ print स्पष्ट रूप से कुछ करने की आवश्यकता है। [1] 9 जो चीजें आप प्राप्त कर रहे हैं वह इसलिए है क्योंकि आप स्पष्ट रूप से y के मानों को प्रिंट कर रहे हैं।

यहां एक उदाहरण है कि आप ऐसा करने के बारे में क्या सोचना चाहेंगे।

> DF <- data.frame(A = rnorm(100), B = rlnorm(100)) 
> y <- 1 
> shapiro.test(DF[,y]) 

    Shapiro-Wilk normality test 

data: DF[, y] 
W = 0.9891, p-value = 0.5895 

तो हमारे पास स्वचालित प्रिंटिंग है।

for(y in 1:2) { 
    print(shapiro.test(DF[,y])) 
} 

आप और अधिक परीक्षण बाहर मुद्रित करने के लिए चाहते हैं, तो बस उन्हें के रूप में अतिरिक्त लाइनें पाश में जोड़ें:: पाश में हम यह करने के लिए होता है

for(y in 1:2) { 
    writeLines(paste("Shapiro Wilks Test for column", y)) 
    print(shapiro.test(DF[,y])) 
    writeLines(paste("Anderson Darling Test for column", y)) 
    print(ad.test(DF[,y])) 
} 

लेकिन है कि बहुत नहीं है आकर्षक जब तक आप आउटपुट के रीम्स के माध्यम से पढ़ना पसंद नहीं करते हैं। इसके बजाए, फिट टेस्ट ऑब्जेक्ट्स को क्यों न सहेजें और फिर आप उन्हें प्रिंट कर सकते हैं और उनकी जांच कर सकते हैं, शायद उन्हें टेस्ट आंकड़ों और पी-वैल्यू को टेबल में एकत्र करने के लिए भी संसाधित कर सकते हैं?

## object of save fitted objects in 
obj <- vector(mode = "list", length = 2) 
## loop 
for(y in seq_along(obj)) { 
    obj[[y]] <- shapiro.test(DF[,y]) 
} 

हम तो

> obj[[1]] 

    Shapiro-Wilk normality test 

data: DF[, y] 
W = 0.9891, p-value = 0.5895 
उदाहरण के लिए

का उपयोग कर, या lapply का उपयोग कर मॉडल को देखने कर सकते हैं, जो वस्तु की स्थापना का ख्याल रखता है हम स्टोर करने के लिए उपयोग करें: आपको लगता है कि एक पाश का उपयोग कर सकते हमारे लिए परिणाम:

> obj2 <- lapply(DF, shapiro.test) 
> obj2[[1]] 

    Shapiro-Wilk normality test 

data: X[[1L]] 
W = 0.9891, p-value = 0.5895 

कहते हैं अब मैं W और p-value डेटा निकालने के लिए, हम वस्तु ext करने के लिए सभी परिणाम भंडारण संसाधित कर सकते हैं चाहता था बिट्स हम चाहते हैं, जैसे ract:

> tab <- t(sapply(obj2, function(x) c(x$statistic, x$p.value))) 
> colnames(tab) <- c("W", "p.value") 
> tab 
      W  p.value 
A 0.9890621 5.894563e-01 
B 0.4589731 1.754559e-17 

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

> tab2 <- lapply(obj2, function(x) c(W = unname(x$statistic), 
+         `p.value` = x$p.value)) 
> tab2 <- data.frame(do.call(rbind, tab2)) 
> printCoefmat(tab2, has.Pvalue = TRUE) 
     W p.value  
A 0.9891 0.5895  
B 0.4590 <2e-16 *** 
--- 
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

यह मिल गया है स्क्रीन है कि आप तो डालना करने के लिए उत्पादन फायरिंग की तुलना में बेहतर होने के लिए के माध्यम से?

+0

बहुत बहुत धन्यवाद, गेविन। मुझे नहीं पता था कि लूप और कार्यों में "प्रिंट" बंद कर दिया गया था। डॉक्टर ने यह नहीं कहा था। मैं "y in seq_along (obj)" से भी अपरिचित था। पता नहीं था कि आप ऐसा कर सकते हैं! आपका जवाब बहुत उपयोगी है। –

+0

मुझे 'printCoefmat' के बारे में पता नहीं था। महान!! – Rodrigo

32

कोई नया उत्तर नहीं, लेकिन उपर्युक्त के अतिरिक्त: "फ्लश।कंसोल() "पाश के दौरान नहीं बल्कि के बाद से जगह लेने के लिए मुद्रण के लिए मजबूर करने के लिए आवश्यक है। केवल कारण मैं एक पाश के दौरान प्रिंट() का उपयोग कई फाइलों को पढ़ने की, प्रगति, जैसे को दिखाने के लिए है।

for (i in 1:10) { 
    print(i) 
    flush.console() 
    for(j in 1:100000) 
    k <- 0 
} 
+0

शीर्षक में बताए गए प्रश्न का उत्तर देने के लिए वोट दें। इसे संपादित किया जाना चाहिए इस प्रकार इस प्रश्न का शीर्षक प्रश्न से मेल नहीं खाता है। – aldux

+0

flush.console के लिए वोट() – szeta

4

बढ़िया जवाब गेविन सिम्पसन से। मैं जादू के अंतिम बिट लिया और एक समारोह में बदल गया।

sw.df <- function (data) { 
    obj <- lapply(data, shapiro.test) 
    tab <- lapply(obj, function(x) c(W = unname(x$statistic), `p.value` = x$p.value)) 
    tab <- data.frame(do.call(rbind, tab)) 
    printCoefmat(tab, has.Pvalue = TRUE) 
} 

तो फिर तुम बस इसे अपने डेटा फ्रेम sw.df (DF)

साथ कॉल कर सकते हैं और अगर आप चाहते हैं परिवर्तन की कोशिश करने के लिए: sw.df (लॉग (डीएफ))

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