2013-07-25 6 views
6

मैं my problem को दोबारा पोस्ट कर रहा हूं, जब मैंने देखा कि knitr के लेखक द्वारा अधिक सहायता प्राप्त करने के लिए सलाह दी गई थी।knitr बनाम इंटरएक्टिव आर व्यवहार

मैं एक .Rmd फ़ाइल है कि मैं एक इंटरैक्टिव आर सत्र में लाइन द्वारा लाइन आगे बढ़ सकते हैं के साथ एक सा पहेली, और भी R CMD BATCH साथ हूँ, लेकिन यह काम नहीं करता जब knit("test.Rmd") का उपयोग कर। मुझे यकीन नहीं है कि समस्या कहां झूठ बोल रही है, और मैंने समस्या को कम करने की कोशिश की जितनी मैं कर सकता था।

```{r Rinit, include = FALSE, cache = FALSE} 
opts_knit$set(stop_on_error = 2L) 
library(adehabitatLT) 
``` 

The functions to be used later: 

```{r functions} 
ld <- function(ltraj) { 
    if (!inherits(ltraj, "ltraj")) 
     stop("ltraj should be of class ltraj") 
    inf <- infolocs(ltraj) 
    df <- data.frame(
     x = unlist(lapply(ltraj, function(x) x$x)), 
     y = unlist(lapply(ltraj, function(x) x$y)), 
     date = unlist(lapply(ltraj, function(x) x$date)), 
     dx = unlist(lapply(ltraj, function(x) x$dx)), 
     dy = unlist(lapply(ltraj, function(x) x$dy)), 
     dist = unlist(lapply(ltraj, function(x) x$dist)), 
     dt = unlist(lapply(ltraj, function(x) x$dt)), 
     R2n = unlist(lapply(ltraj, function(x) x$R2n)), 
     abs.angle = unlist(lapply(ltraj, function(x) x$abs.angle)), 
     rel.angle = unlist(lapply(ltraj, function(x) x$rel.angle)), 
     id = rep(id(ltraj), sapply(ltraj, nrow)), 
     burst = rep(burst(ltraj), sapply(ltraj, nrow))) 
    class(df$date) <- c("POSIXct", "POSIXt") 
    attr(df$date, "tzone") <- attr(ltraj[[1]]$date, "tzone") 
    if (!is.null(inf)) { 
     nc <- ncol(inf[[1]]) 
     infdf <- as.data.frame(matrix(nrow = nrow(df), ncol = nc)) 
     names(infdf) <- names(inf[[1]]) 
     for (i in 1:nc) infdf[[i]] <- unlist(lapply(inf, function(x) x[[i]])) 
     df <- cbind(df, infdf) 
    } 
    return(df) 
} 
ltraj2sldf <- function(ltr, proj4string = CRS(as.character(NA))) { 
    if (!inherits(ltr, "ltraj")) 
     stop("ltr should be of class ltraj") 
    df <- ld(ltr) 
    df <- subset(df, !is.na(dist)) 
    coords <- data.frame(df[, c("x", "y", "dx", "dy")], id = as.numeric(row.names(df))) 
    res <- apply(coords, 1, function(dfi) Lines(Line(matrix(c(dfi["x"], 
     dfi["y"], dfi["x"] + dfi["dx"], dfi["y"] + dfi["dy"]), 
     ncol = 2, byrow = TRUE)), ID = format(dfi["id"], scientific = FALSE))) 
    res <- SpatialLinesDataFrame(SpatialLines(res, proj4string = proj4string), 
     data = df) 
    return(res) 
} 
``` 

I load the object and apply the `ltraj2sldf` function: 

```{r fail} 
load("tr.RData") 
juvStp <- ltraj2sldf(trajjuv, proj4string = CRS("+init=epsg:32617")) 
dim(juvStp) 
``` 

knitr("test.Rmd") का उपयोग के साथ विफल रहता है:: यहाँ उदाहरण (test.Rmd में) है सीधे कॉल का उपयोग करते हुए आर कंसोल में के बाद त्रुटि काम करता है की उम्मीद के रूप में हुई

label: fail 
Quitting from lines 66-75 (test.Rmd) 
Error in SpatialLinesDataFrame(SpatialLines(res, proj4string = 
proj4string), (from  <text>#32) : 
    row.names of data and Lines IDs do not match 

...

समस्या format से संबंधित है आईडी (applyltraj2sldf की कॉल में) आईडी 100,000 से पहले: एक इंटरैक्टिव कॉल का उपयोग करके, आर "99 994", "99 995", "99 996", "99 997", "99 998" "," 99 99 9 "," 100000 "; बुनाई आर का उपयोग करके "99 99 4", "99 995", "99 996", "99 997", "99 998", "99 999", "100000" अतिरिक्त अतिरिक्त रिक्त स्थान के साथ।

क्या इस व्यवहार के लिए कोई कारण है? knitr आर में प्रत्यक्ष कॉल से अलग व्यवहार क्यों करना चाहिए? मुझे यह मानना ​​है कि मुझे उस समय के साथ कठिन समय है, क्योंकि मैं इसे डीबग नहीं कर सकता (यह एक इंटरैक्टिव सत्र में काम करता है)!

किसी भी संकेत की बहुत सराहना की जाएगी। अगर यह मदद करता है तो मैं RData प्रदान कर सकता हूं (फ़ाइल 4.5 एमओ है), लेकिन मुझे अधिकतर दिलचस्पी है कि ऐसा अंतर क्यों होता है। मैंने बिना किसी सफलता के एक आत्म-पुनरुत्पादित उदाहरण के साथ आने की कोशिश की, इसके बारे में खेद है। किसी भी योगदान के लिए अग्रिम धन्यवाद!


बैपटिस्ट की टिप्पणी के बाद, यहां आईडी पीढ़ी के बारे में कुछ और विवरण दिए गए हैं। असल में, आईडी apply कॉल द्वारा डेटा फ्रेम की प्रत्येक पंक्ति पर उत्पन्न होता है, जो बदले में format का उपयोग करता है: format(dfi["id"], scientific = FALSE)। यहां, कॉलम id पंक्तियों की संख्या से 1 श्रृंखला (1:nrow(df)) है। scientific = FALSE यह सुनिश्चित करने के लिए है कि मेरे पास 100000 के लिए 1e + 05 जैसे परिणाम नहीं हैं।

आईडी पीढ़ी की खोज के आधार पर, समस्या केवल पहले संदेश में प्रस्तुत की गई समस्याओं के लिए हुई, यानी 99 995 से 99 999, जिसके लिए एक प्रमुख स्थान जोड़ा जाता है। यह format कॉल के साथ नहीं होना चाहिए, क्योंकि मैंने आउटपुट में विशिष्ट संख्या में अंक नहीं मांगा था। उदाहरण के लिए:

> format(99994:99999, scientific = FALSE) 
[1] "99994" "99995" "99996" "99997" "99998" "99999" 

हालांकि, आईडी मात्रा में उत्पन्न कर रहे हैं, तो यह हो सकता है:

> format(99994:100000, scientific = FALSE) 
[1] " 99994" " 99995" " 99996" " 99997" " 99998" " 99999" "100000" 

नोट एक समय में एक ही एक संसाधित की उम्मीद परिणाम देता है कि:

> for (i in 99994:100000) print(format(i, scientific = FALSE)) 
[1] "99994" 
[1] "99995" 
[1] "99996" 
[1] "99997" 
[1] "99998" 
[1] "99999" 
[1] "100000" 

अंत में, यह ठीक है जैसे आईडी एक समय में तैयार नहीं की गई थी (जैसा कि मैं apply लाइन से कॉल करता हूं), लेकिन इस मामले में, 6 एक समय में, और केवल 1e + 05 के करीब ... एन डी निश्चित रूप से, केवल knitr का उपयोग करते समय, इंटरैक्टिव या बैच आर नहीं।

> sessionInfo() 
R version 3.0.1 (2013-05-16) 
Platform: x86_64-pc-linux-gnu (64-bit) 

locale: 
[1] LC_CTYPE=fr_FR.UTF-8  LC_NUMERIC=C    
[3] LC_TIME=fr_FR.UTF-8  LC_COLLATE=fr_FR.UTF-8  
[5] LC_MONETARY=fr_FR.UTF-8 LC_MESSAGES=fr_FR.UTF-8 
[7] LC_PAPER=C     LC_NAME=C     
[9] LC_ADDRESS=C    LC_TELEPHONE=C    
[11] LC_MEASUREMENT=fr_FR.UTF-8 LC_IDENTIFICATION=C  

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

other attached packages: 
[1] knitr_1.2   adehabitatLT_0.3.12 CircStats_0.2-4  
[4] boot_1.3-9   MASS_7.3-27   adehabitatMA_0.3.6 
[7] ade4_1.5-2   sp_1.0-11   basr_0.5.3   

loaded via a namespace (and not attached): 
[1] digest_0.6.3 evaluate_0.4.4 formatR_0.8  fortunes_1.5-0 
[5] grid_3.0.1  lattice_0.20-15 stringr_0.6.2 tools_3.0.1 
+0

लंबे समय से गोली मार दी: 'knitr', कुछ स्वरूपण विकल्प (सार्थक अंकों की जैसे संख्या) बदल सकता है किसी भी तरह प्रभावित कर रहा है कि कैसे आईडी नहीं बनाया गया है। – baptiste

+0

यह हो सकता है। लेकिन मुझे अभी भी नहीं दिख रहा है कि इस आउटपुट को कौन से विकल्प प्रभावित कर सकते हैं।मुझे अपने पहले संदेश में आईडी की पीढ़ी के बारे में अधिक जानकारी दें ... देखें कि क्या यह अधिक समझ में आता है! धन्यवाद। –

+0

क्या आप इस प्रारूप की समस्या के साथ एक न्यूनतम उदाहरण बना सकते हैं? मैं आवेदन और सफेद अंतरिक्ष पैडिंग के बारे में थोड़ा समझ में नहीं आता। क्या आपकी सूची में 10000 है, या नहीं? – baptiste

उत्तर

2

मैं इस जानकारी के साथ अपने knitr GitHub issue में कोई टिप्पणी जोड़ी:


यहाँ मेरी सत्र जानकारी है।

format() अतिरिक्त सफेद जगह जोड़ता है जब digits विकल्प मान प्रदर्शित करने के लिए पर्याप्त नहीं है लेकिन scientific=FALSE भी निर्दिष्ट है। knitr कोड ब्लॉक के अंदर 4 करने के लिए digits सेट है, जो व्यवहार आप का वर्णन का कारण बनता है:

options(digits=4) 
format(99999, scientific=FALSE) 

का उत्पादन:

[1] " 99999" 

जबकि:

options(digits=5) 
format(99999, scientific=FALSE) 

का उत्पादन:

[1] "99999" 
+0

काफी सही! इससे मुझे जितना संभव हो सके समस्या को कम करने के लिए प्रेरित किया गया, और 'विकल्प (अंक = एक्स)' वास्तव में समस्या का ट्रिगर है! नीचे मेरा जवाब देखें। –

3

जेफ और बैपटिस्ट दोनों ही थे ई वास्तव में सही थे! digits तर्क से संबंधित यह एक विकल्प समस्या है।

Simple reproducible example : df1 is a data frame of 110,000 rows, 
with 2 random normal variables + an `id` variable which is a series 
from 1 to the number of row. 

```{r example} 
df1 <- data.frame(x = rnorm(110000), y = rnorm(110000), id = 1:110000) 
``` 

From this, we create a `id2` variable using `format` and `scientific = 
FALSE` to have results with all numbers instead of scientific 
notations (e.g. 100,000 instead of 1e+05): 

```{r example-continued} 
df1$id2 <- apply(df1, 1, function(dfi) format(dfi["id"], scientific = FALSE)) 
df1$id2[99990:100010] 
``` 

यह रूप में सहभागी आर का उपयोग कर की उम्मीद, जिसके परिणामस्वरूप में काम करता है:

[1] "99990" "99991" "99992" "99993" "99994" "99995" "99996" 
[8] "99997" "99998" "99999" "100000" "100001" "100002" "100003" 
[15] "100004" "100005" "100006" "100007" "100008" "100009" "100010" 

हालांकि, परिणामों काफी अलग knit का उपयोग कर रहे हैं मैं एक काम कर रहे कम से कम उदाहरण (test.Rmd में जैसे) के साथ आने में कामयाब :

> library(knitr) 
> knit("test.Rmd") 

[...] 

## [1] "99990" "99991" "99992" "99993" "99994" " 99995" " 99996" 
## [8] " 99997" " 99998" " 99999" "100000" "100001" "100002" "100003" 
## [15] "100004" "100005" "100006" "100007" "100008" "100009" "100010" 

नोट अतिरिक्त प्रमुख रिक्त स्थान 99994. के बाद अंतर वास्तव में digits optio से आता है n, जेफ द्वारा सही तरीके से सुझाव दिया गया है: आर डिफ़ॉल्ट रूप से 7 का उपयोग करता है, जबकि knitr 4 का उपयोग करता है। यह अंतर format के आउटपुट को प्रभावित करता है, हालांकि मुझे वास्तव में यह नहीं पता कि यहां क्या हो रहा है। आर-शैली:

> options(digits = 7) 
> format(99999, scientific = FALSE) 
[1] "99999" 

knitr शैली:

> options(digits = 4) 
> format(99999, scientific = FALSE) 
[1] " 99999" 

लेकिन यह सभी नंबरों को प्रभावित बस के बाद 99,994 (अच्छी तरह से, ईमानदारी से, मैं भी समझ में नहीं आता नहीं क्यों यह अग्रणी जोड़ने है चाहिए रिक्त स्थान सभी): knitr, apply या format:

> options(digits = 4) 
> format(c(1:10, 99990:100000), scientific = FALSE) 
[1] "  1" "  2" "  3" "  4" "  5" "  6" "  7" 
[8] "  8" "  9" " 10" " 99990" " 99991" " 99992" " 99993" 
[15] " 99994" " 99995" " 99996" " 99997" " 99998" " 99999" "100000"  

इस से, मुझे नहीं पता कि जो गलती है है? कम से कम, format में trim = TRUE तर्क का उपयोग करके, मैं एक कामकाज के साथ आया था। यह समस्या के कारण को हल नहीं करता है, लेकिन परिणामों में अग्रणी स्थान को हटा दिया है ...

+0

अच्छी तरह से, मैं इसे समझ में नहीं आता, या तो; शायद यह कहीं भी दस्तावेज है, हालांकि –

+0

मैंने आर-सहायता सूची में एक संदेश भेजा, चलो देखते हैं कि किसी के बारे में और अधिक विचार हैं ... https://stat.ethz.ch/pipermail/r-help/2013-July /357642.html –