Size: a a a

R (язык программирования)

2020 September 25

AS

Alexey Seleznev in R (язык программирования)
Create a function to generate exceptions. The exceptions can be a linear hierarchy that extends the simple error class

exception <-
   function(class, msg)
{
   cond <- simpleError(msg)
   class(cond) <- c(class, "MyException", class(cond))
   stop(cond)
}


Here's your function

divideByX <- function(x){
   # If x is 0 throws exception
   if (length(x) != 1) {
       exception("NonScalar", "x is not length 1")
   } else if (is.na(x)) {
       exception("IsNA", "x is NA")
   } else if (x == 0) {
       exception("DivByZero", "divide by zero")
   }
   10 / x
}


and use to generate the output you asked for

lapply(tempList, function(x) tryCatch({
   divideByX(x)
}, MyException=function(err) {
   conditionMessage(err)
}))


or to treat some exceptions differently from others

lapply(list(NA, 3:5), function(x) tryCatch({
+     divideByX(x)
+ }, IsNA=function(err) {
+     warning(err)  # signal a warning, return NA
+     NA
+ }, NonScalar=function(err) {
+     stop(err)     # fail
+ }))
Error: x is not length 1
In addition: Warning message:
x is NA
источник

АК

Артём Клевцов... in R (язык программирования)
Alexey Seleznev
Create a function to generate exceptions. The exceptions can be a linear hierarchy that extends the simple error class

exception <-
   function(class, msg)
{
   cond <- simpleError(msg)
   class(cond) <- c(class, "MyException", class(cond))
   stop(cond)
}


Here's your function

divideByX <- function(x){
   # If x is 0 throws exception
   if (length(x) != 1) {
       exception("NonScalar", "x is not length 1")
   } else if (is.na(x)) {
       exception("IsNA", "x is NA")
   } else if (x == 0) {
       exception("DivByZero", "divide by zero")
   }
   10 / x
}


and use to generate the output you asked for

lapply(tempList, function(x) tryCatch({
   divideByX(x)
}, MyException=function(err) {
   conditionMessage(err)
}))


or to treat some exceptions differently from others

lapply(list(NA, 3:5), function(x) tryCatch({
+     divideByX(x)
+ }, IsNA=function(err) {
+     warning(err)  # signal a warning, return NA
+     NA
+ }, NonScalar=function(err) {
+     stop(err)     # fail
+ }))
Error: x is not length 1
In addition: Warning message:
x is NA
Недавно завезли errorCondition и warningCondition, в которые можно явно передать вектор с классами.
источник

AS

Alexey Seleznev in R (язык программирования)
Артём Клевцов
Недавно завезли errorCondition и warningCondition, в которые можно явно передать вектор с классами.
Я просто раньше вообще не слышал о том, что можно свои исключения запилить, сейчас гляну на errorCondition и warningCondition
источник

АК

Артём Клевцов... in R (язык программирования)
Alexey Seleznev
Я просто раньше вообще не слышал о том, что можно свои исключения запилить, сейчас гляну на errorCondition и warningCondition
> tryCatch(
+   errorCondition("Test message", class = "CustomError"),
+   CustomError = function(e) message(e)
+ )
<CustomError: Test message>
источник

AS

Alexey Seleznev in R (язык программирования)
Артём Клевцов
> tryCatch(
+   errorCondition("Test message", class = "CustomError"),
+   CustomError = function(e) message(e)
+ )
<CustomError: Test message>
оо, благодарочка, потому что в доке по этим функциям нет примера
источник

AS

Alexey Seleznev in R (язык программирования)
Артём Клевцов
> tryCatch(
+   errorCondition("Test message", class = "CustomError"),
+   CustomError = function(e) message(e)
+ )
<CustomError: Test message>
только вроде ещё в stop() завернуть надо

tryCatch(
 stop(errorCondition("Test message", class = "CustomError")),
 CustomError = function(e) message(e)
)
источник

АК

Артём Клевцов... in R (язык программирования)
Alexey Seleznev
только вроде ещё в stop() завернуть надо

tryCatch(
 stop(errorCondition("Test message", class = "CustomError")),
 CustomError = function(e) message(e)
)
Не надо, если нет задачи код уронить. Если надо просто обработать исключения, то можно просто errorCondition.
источник

АК

Артём Клевцов... in R (язык программирования)
Alexey Seleznev
только вроде ещё в stop() завернуть надо

tryCatch(
 stop(errorCondition("Test message", class = "CustomError")),
 CustomError = function(e) message(e)
)
Сам stop имплицитно генериит simpleError исключение (condition).
источник

MM

Mikle Mikle in R (язык программирования)
Коллеги, вопрос по tidymodels и тюнингу моделей.
Обучаю random forest (engine - ranger), n = 2000, p = 5000 (почти все дамми-переменные).
Тюню модель через grid, вот код:
rf_tuning_model <-
 rand_forest(trees = tune(),
             min_n = tune(),
             mtry = tune()) %>%
 set_mode("regression") %>%
 set_engine("ranger")

rf_workflow <- workflow() %>%
 add_recipe(recipe_for_modelling) %>%
 add_model(rf_tuning_model)

set.seed(543)
rf_tuning_folds <- vfold_cv(train, v = 10, breaks = 30)

doParallel::registerDoParallel()

set.seed(345)
tune_rf <- tune_grid(
 rf_workflow,
 resamples = rf_tuning_folds,
 grid = 20
)

Тюнится уже часов 13 - это ок или скорее всего что-то не так?
Может не распараллелил? Вроде процессор на 90%+ используется. Есть способ как-то ускориться?
Процессор:
 Intel(R) Core(TM) i5-7200U CPU @ 2.50GHz

 Базовая скорость:  2,70 ГГц
 Сокетов:  1
 Ядра:  2
 Логических процессоров:  4
 Виртуализация:  Отключено
 Поддержка Hyper-V:  Да
 Кэш L1:  128 КБ
 Кэш L2:  512 КБ
 Кэш L3:  3,0 МБ

 Использование  88%
 Скорость  3,08 ГГц
 Время работы  13:18:58:11
 Процессы  180
 Потоки  2303
 Дескрипторы  82243
источник

ЕТ

Евгений Томилов... in R (язык программирования)
Mikle Mikle
Коллеги, вопрос по tidymodels и тюнингу моделей.
Обучаю random forest (engine - ranger), n = 2000, p = 5000 (почти все дамми-переменные).
Тюню модель через grid, вот код:
rf_tuning_model <-
 rand_forest(trees = tune(),
             min_n = tune(),
             mtry = tune()) %>%
 set_mode("regression") %>%
 set_engine("ranger")

rf_workflow <- workflow() %>%
 add_recipe(recipe_for_modelling) %>%
 add_model(rf_tuning_model)

set.seed(543)
rf_tuning_folds <- vfold_cv(train, v = 10, breaks = 30)

doParallel::registerDoParallel()

set.seed(345)
tune_rf <- tune_grid(
 rf_workflow,
 resamples = rf_tuning_folds,
 grid = 20
)

Тюнится уже часов 13 - это ок или скорее всего что-то не так?
Может не распараллелил? Вроде процессор на 90%+ используется. Есть способ как-то ускориться?
Процессор:
 Intel(R) Core(TM) i5-7200U CPU @ 2.50GHz

 Базовая скорость:  2,70 ГГц
 Сокетов:  1
 Ядра:  2
 Логических процессоров:  4
 Виртуализация:  Отключено
 Поддержка Hyper-V:  Да
 Кэш L1:  128 КБ
 Кэш L2:  512 КБ
 Кэш L3:  3,0 МБ

 Использование  88%
 Скорость  3,08 ГГц
 Время работы  13:18:58:11
 Процессы  180
 Потоки  2303
 Дескрипторы  82243
Попробуйте сделать поменьше сетку для перебора. =) Если я верно понимаю, то вы слишком много разбиений на фолды сделали.
источник

MM

Mikle Mikle in R (язык программирования)
вроде стандартные 10
источник

ЕТ

Евгений Томилов... in R (язык программирования)
Попробуйте 5.
источник

MM

Mikle Mikle in R (язык программирования)
но grid - да, еще и дефолтный выбрал, видимо это на долго)
источник
2020 September 26

A

Andrey in R (язык программирования)
Помогите забороть duckdb. Пытаюсь создать базу из csv-файла, размер которого больше ОЗУ. duckdb_read_csv() или dbExecute(con, "COPY db FROM 'data/db.csv' ( HEADER )") одинаково пытаются выжрать всю оперативку и вешают комп. Такая проблема не только у меня https://github.com/cwida/duckdb/issues/894 Вариант PRAGMA memory_limit='16GB' не работает (или я неправильно им пользуюсь - передаю эту команду в dbExecute())
источник

АК

Артём Клевцов... in R (язык программирования)
Andrey
Помогите забороть duckdb. Пытаюсь создать базу из csv-файла, размер которого больше ОЗУ. duckdb_read_csv() или dbExecute(con, "COPY db FROM 'data/db.csv' ( HEADER )") одинаково пытаются выжрать всю оперативку и вешают комп. Такая проблема не только у меня https://github.com/cwida/duckdb/issues/894 Вариант PRAGMA memory_limit='16GB' не работает (или я неправильно им пользуюсь - передаю эту команду в dbExecute())
dbExecute(con, "PRAGMA memory_limit='4GB'")

Не работает?
источник

A

Andrey in R (язык программирования)
Нет, причем проверял именно с 4Гб. Попробую еще раз
источник

A

Andrey in R (язык программирования)
Непонятно, зачем вообще грузить в ОЗУ то, что должно проходить транзитом и писаться в БД
источник

АК

Артём Клевцов... in R (язык программирования)
Есть более релевантные репорты:
https://github.com/cwida/duckdb/issues/825
https://github.com/cwida/duckdb/issues/926
источник

АК

Артём Клевцов... in R (язык программирования)
Проблему подтверждаю. Код для генерации данных:
library(data.table)
set.seed(123)
n <- 10e12
nn <- 10e6
unlink("~/Projects/R/test.csv")
for (i in 1:200) {
 tmp <- data.table(
   a = sample.int(1000, nn, replace = TRUE),
   b = runif(nn)
 )
 fwrite(tmp, "~/Projects/R/test.csv", append = TRUE)
 rm(tmp)
}
Код для воспроизведения проблемы:

library(duckdb)
library(DBI)
con <- dbConnect(
 drv = duckdb(),
 dbdir = "~/Projects/R/duckdb",
 debug = TRUE
)
dbGetQuery(con, "PRAGMA version")
dbExecute(con, "PRAGMA memory_limit='4G'")
duckdb_read_csv(con, "test", "~/Projects/R/test.csv")
источник

АК

Артём Клевцов... in R (язык программирования)
Говорит, лимит надо до старта базы установить.
https://github.com/cwida/duckdb/issues/825#issuecomment-672815660
источник