У меня есть файл встреч 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)
```