Nano Hash - криптовалюты, майнинг, программирование

обобщить lapply/map для всех перестановок нескольких аргументов

Я хочу проверить, работает ли функция f, имеющая несколько аргументов, как хотелось бы.

f <- function(x1, ..., xm) {...}

Что я хочу сделать, это указать списки

x1_arguments <- list(x1_1, ..., x1_n1)
...
xm_arguments <- list(xm_1, ..., xm_nm)

и проверьте, что f работает для всех возможных комбинаций x1,...,xm.

я мог конечно

  1. Напишите, например. кадр данных, в котором строки содержат возможные комбинации аргументов x1, ... xm. а затем перебрать строки

  2. Напишите вложенный цикл for/lapply

Однако я хотел бы сделать его красивее, поскольку 1. создает возможно большой объект, который абсолютно не нужен, и 2. выглядит некрасиво.

Есть ли встроенная R-функция, которая позволяет вам это делать, например. обобщенная функция lapply, которая перебирает несколько списков?


  • n = 2 было просто для иллюстрации, должно было быть яснее 05.03.2020
  • Вы ищете mapply() 05.03.2020

Ответы:


1

Существует встроенная функция для применения к нескольким итерациям:

mapply()

В твоем случае:

mapply(f, x = x_arguments, y = y_arguments)

Возможно, вам придется расположить x и y так, чтобы все возможные комбинации экземпляров совпадали, но как только вы это сделаете, вы сможете использовать эту функцию.

05.03.2020
  • на самом деле это не то, что я хочу. Я хочу, чтобы он оценивал ВСЕ возможные комбинации, например. если x_arguments = (1,2), y_arguments = (3,4), я хочу, чтобы он оценивал (1,3), (1,4), (2,3), (2.4) 05.03.2020
  • @ Себастьян, тогда вам просто нужно исправить свои входные данные, xi <- rep(seq_along(x), length(y)); yi <- rep(seq_along(y), each = length(x)) указать индексы x и y, затем mapply(f, x = x_arguments[xi], y = y_arguments[yi]) 05.03.2020
  • это было бы в основном моим решением 1. и я хочу избежать создания ненужных данных 05.03.2020
  • измените свою функцию на f <- function(x1i, x2i, ..., xmi) {x1 <- x1_args[x1i]; x2 <- x2_args[x2i]; ...}, т. е. единственное место, где вы используете свой список аргументов, находится в f и передаете только индексы в x1_arguments... это в основном обобщенный, вложенный цикл for для mapply; ваш звонок будет выглядеть так mapply(f, xi, yi) 05.03.2020

  • 2

    Вы ищете outer.

    outer(1:3, 4:6, FUN=`^`)
    #      [,1] [,2] [,3]
    # [1,]    1    1    1
    # [2,]   16   32   64
    # [3,]   81  243  729
    

    Чтобы получить векторный формат, используйте

    as.vector(outer(1:3, 4:6, FUN=`^`))
    # [1]   1  16  81   1  32 243   1  64 729
    

    mapply в основном выбрасывает только диагональ.

    mapply(FUN=`^`, 1:3, 4:6)
    # [1]   1  32 729
    

    Редактировать

    Для получения дополнительных аргументов вы можете попробовать expand.grid.

    f <- function(x, y, z) x + y - z
    

    Просто расширьте свои аргументы на все возможные перестановки combinations.

    args <- expand.grid(
      x1=1:3,
      x2=4:6,
      xn=7:9)
    
    head(args)
    #   x1 x2 xn
    # 1  1  4  7
    # 2  2  4  7
    # 3  3  4  7
    # 4  1  5  7
    # 5  2  5  7
    # 6  3  5  7
    

    И распакуйте их в .GlobalEnv.

    list2env(args, envir=.GlobalEnv)
    

    Затем вы можете использовать mapply.

    mapply(f, x1, x2, xn)
    # [1] -2 -1  0 -1  0  1  0  1  2 -3 -2 -1 -2 -1  0 -1  0  1 -4 -3
    # [21] -2 -3 -2 -1 -2 -1  0
    
    05.03.2020
  • @ Себастьян, что именно ты имеешь в виду? 05.03.2020
  • Я хочу иметь больше, чем только x и y (пример в вопросе был только для иллюстративных целей, и теперь он изменился) 05.03.2020
  • @Sebastian См. редактирование моего ответа и скажите, что вы думаете? 05.03.2020
  • Я думаю, что это нормальное решение (+ 1) (мое собственное решение состояло бы в том, чтобы использовать expand.grid, а затем зацикливаться на строках), однако объект, созданный extend.grid, несколько не нужен, и в идеале я хотел бы избежать этого ... 05.03.2020
  • @Sebastian Надеюсь, вы не возражаете, я переформулировал название вашего вопроса, чтобы придать ему больше смысла и привлечь возможные лучшие ответы. 05.03.2020
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..