ellipsis) в imap-окружении передаются мусорные первые 2 аргумента, которые дублируют .x и .y тем самым засирая это многоточие, что мешает мне передавать это многоточие далее в дочерние подфункции.
Я набрался сил и написал об этом в issues пакета.
Делаем ставки - они возьмут и починят, или начнут меня грузить философией?
https://github.com/tidyverse/purrr/issues/1032
Довольно простенько evalFormula <- function( .formula, .env ) { checkmate::assertFormula(.formula) checkmate::assertEnvironment(.env) return(.formula |> lazyeval::f_interp() |> lazyeval::f_rhs() |> eval(NULL, .env)) } cycleDummy <- function( .object, .formula, ... ) { purrr::imap( .object, function(.x, .i, ...) {evalFormula(.formula, environment())}, ... ) } cycleDummy( c('sd', 'cxd', 'wtf'), ~{paste(c(.x, .i, 23), ...)}, collapse = '+' )
Я был неправ!!!11раз-рас Только что вроде научился делать изолированное дочернее окружение на базе нескольких несвязанных между собой ``` evalFormula <- function( .formula, .env ) { checkmate::assertFormula(.formula) checkmate::assertEnvironment(.env) return(.formula |> lazyeval::f_interp() |> lazyeval::f_rhs() |> eval(NULL, .env)) } cycleDummy <- function( .object, .formula, ... ) { env_caller <- rlang::caller_env() env_process_2 <- environment() parent.env(env_process_2) <- env_caller purrr::imap( .object, function(.x, .i, ...) { # https://stackoverflow.com/questions/26057400/r-how-do-you-merge-combine-two-environments env_process <- environment() parent.env(env_process) <- env_process_2 evalFormula(.formula, env_process) }, ... ) } cycleDummy( c('sd', 'cxd', 'wtf'), ~{paste(c(.x, .i, 23), ...)}, collapse = '+' ) ``` Так полученная функция цикла будет работать как с .x, .i, ... так и с переменными из окружения, которое его вызвало, при этом в своем изолированном дочернем окружении (во всяком случае текущие автотесты это подтверждают)
Обсуждают сегодня