Ошибка Knitr - длинные векторы не поддерживаются - PullRequest
0 голосов
/ 17 мая 2018

У меня есть файл встреч CSV размером 2284x11.Я создал скрипт, который просматривает список пользователей, создает фрейм данных всех встреч, которые имел пользователь, и затем отправляет его в файл .Rmd для экспорта в формате PDF.

Когда я пытаюсь сделать это все сразу, я получаю следующую ошибку:

Error in knitr::knit_meta_add(old_knit_meta, attr(old_knit_meta, "knit_meta_id")) : long vectors not supported yet: ../../../../R-3.3.2/src/main/memory.c:1668

Если я запускаю свой скрипт только для нескольких пользователей ввремя, пока я не покрываю весь список, я не получаю сообщение об ошибке.Это заставляет меня думать, что нет ничего плохого в отдельных таблицах, которые я создаю для каждого пользователя (самая большая - ~ 70x7), но мой сценарий каким-то образом кэширует все результаты неэффективным способом.Я последовал совету:

ошибка "длинные векторы еще не поддерживаются" в Rmd, но не в скрипте R

Но отключение этих настроек кеша не помогло.

Кто-нибудь знает общие причины случайного создания длинных векторов?Еще раз исходный файл csv имеет размер только 2248x11, размером менее 250 КБ, и большинство применяемых преобразований - это просто очистка данных, подмножество и некоторая агрегация.

Есть ли способ просмотреть тип данных, которые я могу использовать?сценарий хранит в фоновом режиме, что может быть причиной этой ошибки?

Редактировать: Вот то, что я думаю, соответствующий код будет.У меня уже есть фрейм данных sessions (включая оплату хосту), фрейм данных hosts и некоторая личная информация, а также фрейм данных tax значений, основанных на местоположении (которые влияют на платежи хоста).

Следующий код R фильтрует сеансы под именем хоста и суммирует значения в столбце Payment.Он отправляет полученную таблицу в файл .Rmd для экспорта в формате pdf.

for (i in 1:nrow(hosts)) {
  #our hosts are paid on one of two monthly cycles
  if (hosts[i,2] == cycle) { 
    #identify sessions under a host's name and that have payment associated
    hostmatch = which(sessions$Host == hosts$Name[i] & sessions$Payment != "") 
    #only continue if host has sessions under their name with associated payments
    if (length(hostmatch) > 0) { 
      hostsessions = sessions[hostmatch,] #filtering for matched sessions
      #just renaming the columns to look better for exported PDF
      colnames(hostsessions) <- c("Host","User","Appointment Date", "Appointment Time", "Appointment Type", "Appointment Status", "Payment to Host") 
      if (all(hostsessions[,7] == "$0.00")) {
        #if all the host's recorded payments were for $0.00, skip to checking the next host
        next 
      }
      else {
        #Payment is recorded as string starting with '$'. This adds up those values for a given host 
        Addup = sum(as.numeric((sub("$","", hostsessions$Payment, fixed = TRUE))))
        if (hosts$PayTax[i] == "no") {
          payout = paste("$", format(round(Addup, 2), nsmall = 2), sep="")
          #This appends a final row that shows the host's total payout. Columns 1:5 are NAs and appear as blank cells in the PDF
          hostsessions[nrow(hostsessions)+1, c(6,7)] <- c('Total:', payout)
        }
        else {
          #modified version of previous loop that accounts for tax, which is listed by Province in a separate table
          #Creates three rows at the end that consist largely of NAs
          hosttax <- merge(hosts[i,], tax, by = 'Province') #Only one row, so subsetting with $ returns a single vector
          hostsessions[nrow(hostsessions)+1, c(6,7)] <- c('Subtotal:', paste("$", format(round(Addup, 2), nsmall = 2), sep="")) 
          #Convoluted way to get an output in the format: 'HST (13%): $10.90'
          hostsessions[nrow(hostsessions)+1, c(6,7)] <- c(paste(unlist(hosttax$TaxType), ' (', as.character((hosttax$TaxAmount - 1) * 100), '%)', sep = ''), paste("$", format(round(Addup*(hosttax$TaxAmount - 1), 2), nsmall = 2), sep=""))   
          payout = paste("$", format(round(Addup*hosttax$TaxAmount, 2), nsmall = 2), sep="")
          hostsessions[nrow(hostsessions)+1, c(6,7)] <- c("Total:", payout) 
        }
        #Send to Payments.Rmd to create pdf
        rmarkdown::render(input = "Payments.Rmd", 
                          output_format = "pdf_document",
                          output_file = paste(host$Name[i]," Statement ",  date, ".pdf", sep=''),
                          output_dir = "~/")
      }
    }
  }
}

Файл .Rmd выглядит следующим образом.Есть ряд операторов \ usepackage, которые я вставил, чтобы преодолеть другие ошибки, с которыми я столкнулся, но я не до конца понимаю, зачем они были нужны.

```{r, include = FALSE}
payment <- paste(hosts$Name[i], " Statement: ", date)
```

---
  title: "`r payment`"
output: pdf_document
classoption: landscape
header-includes:
  - \usepackage{float}
  - \usepackage[table]{xcolor}
  - \usepackage{graphicx}
  - \usepackage{booktabs}
  - \usepackage{longtable} 
---

```{r, echo = FALSE}
library(knitr)
library(markdown)
library(rmarkdown)
#I experimented with different ways of setting cache to false. None of them seemed to work
options(cache = FALSE, warning = FALSE, 
        message = FALSE, cache.lazy = FALSE, knitr.kable.NA = '')
#formats the table previously created that showed all the appointments a host had and the payment associated
kable(hostsessions, format = "latex", booktabs = T, longtable = T) %>%
  kable_styling(latex_options = c("striped", "repeat_header"), font_size = 9) %>%
  row_spec(nrow(counsellorsessions), bold = T)
```
...