Анонимные функции не видят внешние пакеты в ноутбуках Julia Pluto

Вопрос или проблема

Рассмотрим следующие три ячейки в блокноте Julia Pluto.

Сначала мы загружаем пакет.

using Distributions

Затем мы можем использовать экспортированные функции в следующей ячейке (как и ожидалось).

begin
    @show rand(Bernoulli())
    f = x -> rand(Bernoulli())
    @show f(1)
end

Но если закомментировать одну строку, Pluto перестает видеть Bernoulli. Следующая ячейка выдает ошибку UndefVarError: ``Bernoulli`` not defined.

begin
    # @show rand(Bernoulli())
    g = x -> rand(Bernoulli())
    @show g(1)
end

Результат выполнения ячейки в Pluto

В то же время этот код работает в обычном терминале Julia.

Как можно использовать функции пакета внутри анонимной функции в блокнотах Pluto?

Ответ или решение

В Julia Pluto ноутбуках анонимные функции могут иметь некоторые особенности в области видимости, которые связаны с тем, как они обрабатываются во время вычислений. Рассмотрим, как это можно исправить и сделать так, чтобы анонимные функции могли видеть необходимые внешние пакеты.

Проблема

Когда вы создаете анонимную функцию, используя переменные и функции из внешних пакетов, вы можете столкнуться с ошибкой UndefVarError, если не используете их в клетке должным образом. Это связано с тем, что в Pluto каждая клетка является независимой единицей, и видимость переменных может зависеть от того, какие выражения были выполнены ранее.

Решение

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

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

    using Distributions
    
    begin
        @show rand(Bernoulli())
        f = x -> rand(Bernoulli())  # Мы можем ссылаться на Bernoulli после его определения
        @show f(1)
    end
  2. Создание явной ссылки: Если вы хотите, чтобы анонимная функция была определена в те же клетке, где определяются ее внешние зависимости, добавьте соответствующее выражение.

    begin
        using Distributions
        g = x -> rand(Bernoulli())  # Теперь g будет работать
        @show g(1)
    end
  3. Использование встроенных возможностей Pluto: Если вы хотите, чтобы анонимная функция могла использовать переменные из внешних пространств, можно также воспользоваться механизмом Pluto для создания реактивных клеток, где все зависимости будут отслеживаться автоматически.

Пример реализации:

using Distributions

# Инициализация переменной
bernoulli_dist = Bernoulli()

# Определение анонимной функции
f = x -> rand(bernoulli_dist)

# Проверка работы функции
@show f(1)

Заключение

Таким образом, в Julia Pluto для правильной работы анонимных функций с внешними пакетами необходимо уделить внимание их определению и видимости переменных. Убедитесь, что все необходимые пакеты и их функции загружены и определены в той же клетке или в клетках, предшествующих использованию анонимных функций. Это обеспечит корректную работу кода и избавит от ошибок, связанных с отсутствием определения переменных.

Оцените материал
Добавить комментарий

Капча загружается...