На основе ответа ворона это решение заставляет работать кнопку RStudio
Source
.
При нажатии этой кнопки Source
выполняется RStudio
source('myfile.r', encoding = 'UTF-8')
]), поэтому переопределение source
заставляет ошибки исчезать и запускает код, как ожидалось:
source <- function(f, encoding = 'UTF-8') {
l <- readLines(f, encoding=encoding)
eval(parse(text=l),envir=.GlobalEnv)
}
Вы можете написать несколько листов с пакетом xlsx
. Вам просто нужно использовать разные sheetName
для каждого кадра данных, и вам нужно добавить append=TRUE
:
library(xlsx)
write.xlsx(dataframe1, file="filename.xlsx", sheetName="sheet1", row.names=FALSE)
write.xlsx(dataframe2, file="filename.xlsx", sheetName="sheet2", append=TRUE, row.names=FALSE)
Еще один вариант, который дает вам больше контроля над форматированием и где кадр данных чтобы сделать все в коде R / xlsx, а затем сохранить книгу в конце. Например:
wb = createWorkbook()
sheet = createSheet(wb, "Sheet 1")
addDataFrame(dataframe1, sheet=sheet, startColumn=1, row.names=FALSE)
addDataFrame(dataframe2, sheet=sheet, startColumn=10, row.names=FALSE)
sheet = createSheet(wb, "Sheet 2")
addDataFrame(dataframe3, sheet=sheet, startColumn=1, row.names=FALSE)
saveWorkbook(wb, "My_File.xlsx")
В случае, если вы можете найти его полезным, вот некоторые интересные вспомогательные функции, которые упрощают добавление форматирования, метаданных и других функций в электронные таблицы с помощью xlsx
: http://www.sthda.com/english/wiki/r2excel-read-write-and-format-easily-excel-files-using-r-software
Много хороших ответов здесь, но некоторые из них немного устарели. Если вы хотите добавить дополнительные листы в один файл, то это подход, который я нахожу для меня. Для ясности здесь приведен рабочий процесс для openxlsx
версии 4.0
# Create a blank workbook
OUT <- createWorkbook()
# Add some sheets to the workbook
addWorksheet(OUT, "Sheet 1 Name")
addWorksheet(OUT, "Sheet 2 Name")
# Write the data to the sheets
writeData(OUT, sheet = "Sheet 1 Name", x = dataframe1)
writeData(OUT, sheet = "Sheet 2 Name", x = dataframe2)
# Export the file
saveWorkbook(OUT, "My output file.xlsx")
EDIT
Теперь я попробовал несколько других ответов, и мне действительно нравится @ Syed's. Он не использует все функции openxlsx
, но если вы хотите быстрый и простой способ экспорта, то это, вероятно, самый простой.
В городе есть новая библиотека, из rOpenSci: writexl
Портативный, легкий блок данных для экспортера xlsx на основе libxlsxwriter. Нет необходимости в Java или Excel
Я нашел это лучше и быстрее, чем приведенные выше предложения (работа с версией dev):
library(writexl) sheets <- list("sheet1Name" = sheet1, "sheet2Name" = sheet2) #assume sheet1 and sheet2 are data frames write_xlsx(sheets, "path/to/location")
Размер данных incase мал, R имеет множество пакетов и функций, которые могут быть использованы в соответствии с вашим требованием.
write.xlsx, write.xlsx2, XLconnect также выполняет работу, но они иногда медленны, как сравнить с openxlsx.
Итак, если вы имеете дело с большими наборами данных и сталкивались с ошибками Java. Я предлагаю взглянуть на «openxlsx», который действительно потрясающий, и сократить время до 1/12.
Я тестировал все, и, наконец, я был впечатлен производительностью возможностей openxlsx.
Ниже приведены шаги для записи нескольких наборов данных на несколько листов.
install.packages("openxlsx")
library("openxlsx")
start.time <- Sys.time()
# Creating large data frame
x <- as.data.frame(matrix(1:4000000,200000,20))
y <- as.data.frame(matrix(1:4000000,200000,20))
z <- as.data.frame(matrix(1:4000000,200000,20))
# Creating a workbook
wb <- createWorkbook("Example.xlsx")
Sys.setenv("R_ZIPCMD" = "C:/Rtools/bin/zip.exe") ## path to zip.exe
Sys.setenv ("R_ZIPCMD" = "C: /Rtools/bin/zip.exe") имеет чтобы быть статичным, так как требует ссылки на некоторую утилиту из Rtools.
Примечание: Incase Rtools не установлен в вашей системе, сначала установите его для обеспечения плавного перехода. здесь ссылка для вашей ссылки: (выберите соответствующую версию)
https://cran.r-project.org/bin/windows/Rtools/ проверить параметры в соответствии с ссылка ниже (необходимо установить флажок во время установки)
https://cloud.githubusercontent.com/assets/7400673/12230758/99fb2202-b8a6-11e5-82e6-836159440831.png
# Adding a worksheets : parameters for addWorksheet are 1. Workbook Name 2. Sheet Name
addWorksheet(wb, "Sheet 1")
addWorksheet(wb, "Sheet 2")
addWorksheet(wb, "Sheet 3")
# Writing data in to respetive sheets: parameters for writeData are 1. Workbook Name 2. Sheet index/ sheet name 3. dataframe name
writeData(wb, 1, x)
# incase you would like to write sheet with filter available for ease of access you can pass the parameter withFilter = TRUE in writeData function.
writeData(wb, 2, x = y, withFilter = TRUE)
## Similarly writeDataTable is another way for representing your data with table formatting:
writeDataTable(wb, 3, z)
saveWorkbook(wb, file = "Example.xlsx", overwrite = TRUE)
end.time <- Sys.time()
time.taken <- end.time - start.time
time.taken
пакет openxlsx действительно хорош для чтения и записи огромных данных из / в файлах excel и имеет множество опций для пользовательского форматирования в excel.
Интересный Дело в том, что нам не нужно беспокоиться о памяти кучи java здесь.
Я не знаком с пакетом WriteXLS
; Я обычно использую XLConnect
:
library(XLConnect)
##
newWB <- loadWorkbook(
filename="F:/TempDir/tempwb.xlsx",
create=TRUE)
##
for(i in 1:10){
wsName <- paste0("newsheet",i)
createSheet(
newWB,
name=wsName)
##
writeWorksheet(
newWB,
data=data.frame(
X=1:10,
Dataframe=paste0("DF ",i)),
sheet=wsName,
header=TRUE,
rownames=NULL)
}
saveWorkbook(newWB)
Это, безусловно, может быть векторизованным, как отмечалось выше, как @joran, но только для быстрого создания динамических имен листов я использовал цикл for
для демонстрации .
Я использовал аргумент create=TRUE
в loadWorkbook
, так как я создавал новый .xlsx-файл, но если ваш файл уже существует, вам не нужно указывать его, поскольку значение по умолчанию равно FALSE
.
Вот несколько скриншотов созданной книги:
[/g0]
[/g1]
[/g2]
Для меня WriteXLS
предоставляет функциональность, которую вы ищете. Поскольку вы не указали, какие ошибки он возвращает, я покажу вам пример:
Пример
library(WriteXLS)
x <- list(sheet_a = data.frame(a=letters), sheet_b = data.frame(b = LETTERS))
WriteXLS(x, "test.xlsx", names(x))
Объяснение
Если x
:
Подробнее об использовании
?WriteXLS
показано:
`x`: A character vector or factor containing the names of one or
more R data frames; A character vector or factor containing
the name of a single list which contains one or more R data
frames; a single list object of one or more data frames; a
single data frame object.
Решение
Для вашего примера вам нужно будет собрать все data.frames в списке во время цикла и использовать WriteXLS
после завершения цикла.
Информация сессии
xlsx
), поскольку это затрудняет настройку
– R Yoda
28 January 2018 в 15:52
Вы также можете использовать библиотеку openxlsx для экспорта нескольких наборов данных на несколько листов в одной книге. Преимущество openxlsx над xlsx заключается в том, что openxlsx удаляет зависимости от java-библиотек.
Напишите список данных .frames для отдельных листов, используя имена списков в качестве имен рабочих листов.
require(openxlsx)
list_of_datasets <- list("Name of DataSheet1" = dataframe1, "Name of Datasheet2" = dataframe2)
write.xlsx(list_of_datasets, file = "writeXLSX2.xlsx")
openxlsx
является самым быстрым, как его c ++. XlConnect
съест вашу оперативную память. Возможно, вы захотите провести сравнительный анализ между xlsx
и openxlsx
– Hanjo Jo'burg Odendaal
5 April 2016 в 19:38
openxlsx::write.xlsx
- это способ пойти ... Я сохранял 11 листов, каждый из которых был размером в 20 000 x 10, выполненный через пару секунд, в то время как xlsx::write.xlsx
ошибся после добавления второго листа с java.lang.OutOfMemoryError: Java heap space
– Djork
30 March 2017 в 00:59
append=TRUE
в write.xlsx, чтобы он сразу написал несколько листов в один файл Excel
– mondano
19 May 2017 в 13:21
Я делаю это таким образом для openxlsx, используя следующую функцию
mywritexlsx<-function(fname="temp.xlsx",sheetname="Sheet1",data,
startCol = 1, startRow = 1, colNames = TRUE, rowNames = FALSE)
{
if(! file.exists(fname))
wb = createWorkbook()
else
wb <- loadWorkbook(file =fname)
sheet = addWorksheet(wb, sheetname)
writeData(wb,sheet,data,startCol = startCol, startRow = startRow,
colNames = colNames, rowNames = rowNames)
saveWorkbook(wb, fname,overwrite = TRUE)
}
xlsx
не заботится о числах в первой строке R, помещенной там.openxlsx
удалите их. – buhtz 15 August 2016 в 10:01row.names=FALSE
, чтобы удалить имена строк. – eipi10 15 August 2016 в 15:08xlsx
наopenxlsx
некоторое время назад, так как я нахожу его более интуитивным, а также избегает зависимости java. – eipi10 13 June 2018 в 15:06openxlsx
версии 4.0 см. Мой дополнительный ответ ниже. – EcologyTom 14 June 2018 в 07:17