То, что здесь происходит, заключается в том, что когда вы запускаете shiny::runApp()
, spark создает собственную среду для запуска всего кода блестящего кода (я думаю, что это связано с this ). Но когда вы вызываете source()
напрямую, отдельная среда не создается, и все идет прямо в глобальную среду. Это можно увидеть, добавив print(environment())
в файл app.R
. Вы увидите, когда вы source("app.R")
вернете <environment: R_GlobalEnv>
, но когда вы позвоните shiny::runApp()
, вы увидите другое имя среды.
Так что, когда вы наберете source()
в app.R
, снова это загрузка всего контента в локальную среду по умолчанию. Это создает foo<-"XXX"
в глобальной среде, и среда для x()
устанавливается в глобальную среду. Это верно для обоих вызовов. Но когда вы запускаете его с помощью shiny::runApp
, это не работает в глобальной среде, поэтому, когда вы делаете foo <- c(1,2)
, вы обновляете не глобальную среду, а только локальную блестящую среду. Глобальный foo
все еще существует, и благодаря лексической области видимости, глобальное значение - это то, что x
найдет.
Быстрое решение проблемы - использовать
source("b.R", local=TRUE)
в app.R
. Это загрузит значения из b.R
в локальную среду, а не в глобальную среду. Это будет работать в обоих случаях, поскольку вызов source()
непосредственно в "app.R" уже будет выполняться в глобальной среде, поэтому он не будет работать по-другому.