Ясность в вопросе с вложенными функциями и средами в R - PullRequest
0 голосов
/ 04 января 2019

Я создал функцию для сохранения данных в определенном месте, которое загружается как часть пакета при запуске rstudio:

save_data <- function(fileName, file_name){

    file_path <- paste0("~/", file_name)
    save(list=deparse(substitute(fileName)), file=file_path)
}

но при вызове этой функции из другой функции возвращается «Ошибка сохранения следующего файла: ...».

Для воспроизведения проблемы я создал функцию savetest:

savetest <- function(fileName){

    data1 <- fileName * 10
    save_data(data1, file_name = "test.RData")

    data1
}

и небольшой текст для сохранения:

source("savetestfunction.R")

x <- c(1:10)

data1 <- savetest(x)

Я потратил много времени, предполагая, что проблема связана с окружением и тем, что было видно из каждого (например, функция save_data, загруженная при запуске, не видела временную среду, созданную при вызове функции savetest), но в качестве теста я попыталась добавить print(fileName) к функции save_data и, к моему удивлению, она фактически могла видеть, что было fileName на данный момент.

Исправление: я обновил функцию, чтобы она присвоила fileName в среде, созданной функцией save_data, и теперь она функционирует как задумано ...

save_data <- function(fileName, file_name){

    file_path <- paste0("//placeholder//", file_name)

    assign(deparse(substitute(fileName)), fileName)

    save(list=deparse(substitute(fileName)), file=file_path)
}

Путаница: Это привело меня к мысли, что fileName, возможно, был обещанием при сохранении, однако save () содержит аргумент eval.promises, который по умолчанию равен True, поэтому этого не может быть!

Вопрос: Что стало причиной этой проблемы? (Беспорядок, связанный с окружающей средой? Обещания?) Что можно было сделать, чтобы избежать этого?

Edit: пытался использовать saveRDS, но с этим не справился. Больше интересует, почему сохранение не работает в первую очередь, а не фактическое исправление, так как назначение в функции save_data уже позволяет ему функционировать.

...