Вопрос или проблема
Рассмотрим следующие три ячейки в блокноте 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
В то же время этот код работает в обычном терминале Julia.
Как можно использовать функции пакета внутри анонимной функции в блокнотах Pluto?
Ответ или решение
В Julia Pluto ноутбуках анонимные функции могут иметь некоторые особенности в области видимости, которые связаны с тем, как они обрабатываются во время вычислений. Рассмотрим, как это можно исправить и сделать так, чтобы анонимные функции могли видеть необходимые внешние пакеты.
Проблема
Когда вы создаете анонимную функцию, используя переменные и функции из внешних пакетов, вы можете столкнуться с ошибкой UndefVarError
, если не используете их в клетке должным образом. Это связано с тем, что в Pluto каждая клетка является независимой единицей, и видимость переменных может зависеть от того, какие выражения были выполнены ранее.
Решение
Чтобы анонимные функции могли использовать переменные и функции, определенные в других клетках, нужно явно указать, что мы хотим использовать нужные функции и переменные. Есть несколько методов решения данной проблемы:
-
Определение анонимной функции после инициализации: Переменные и функции необходимо определять после того, как они были загружены в пространстве имен. По этой причине лучше переместить определение анонимной функции в клетку после загрузки необходимых библиотек.
using Distributions begin @show rand(Bernoulli()) f = x -> rand(Bernoulli()) # Мы можем ссылаться на Bernoulli после его определения @show f(1) end
-
Создание явной ссылки: Если вы хотите, чтобы анонимная функция была определена в те же клетке, где определяются ее внешние зависимости, добавьте соответствующее выражение.
begin using Distributions g = x -> rand(Bernoulli()) # Теперь g будет работать @show g(1) end
-
Использование встроенных возможностей Pluto: Если вы хотите, чтобы анонимная функция могла использовать переменные из внешних пространств, можно также воспользоваться механизмом
Pluto
для создания реактивных клеток, где все зависимости будут отслеживаться автоматически.
Пример реализации:
using Distributions
# Инициализация переменной
bernoulli_dist = Bernoulli()
# Определение анонимной функции
f = x -> rand(bernoulli_dist)
# Проверка работы функции
@show f(1)
Заключение
Таким образом, в Julia Pluto для правильной работы анонимных функций с внешними пакетами необходимо уделить внимание их определению и видимости переменных. Убедитесь, что все необходимые пакеты и их функции загружены и определены в той же клетке или в клетках, предшествующих использованию анонимных функций. Это обеспечит корректную работу кода и избавит от ошибок, связанных с отсутствием определения переменных.