如何在emacs-ess中从R语言访问bash环境变量

7
在我的 .bashrc 文件中,我有这样一行代码:
export SETTINGS=/home/user/settings.xml

如果我在bash中加载R,我可以使用Sys.getenv函数访问此变量:
Sys.getenv("SETTINGS")
"/home/user/settings.xml"

如果我在Emacs中打开R(M-x R),SETTINGS是空的:
Sys.getenv("SETTINGS")
""

我尝试过以下方法:
  1. adding the following to .emacs, based on How do I make Emacs recognize bash environment variables for compilation?

    ;; get environment vars from .bashrc
    (let ((path (shell-command-to-string ". ~/.bashrc; echo -n $SETTINGS")))
      (setenv "SETTINGS" path))
    
  2. opening up bash in emacs using M-x term

    echo $SETTINGS         # works
    R
    Sys.getenv("SETTINGS") #works
    
  3. If I open emacs from the terminal, the SETTINGS variable is available as expected. Opening emacs from the Applications menu (with either the command /usr/bin/emacs23 %F or emacs) does not work.

  4. comparing output from session("env") when loading R in bash vs emacs, but nothing stands out other than (bash = <, emacs = >):

    > INSIDE_EMACS=23.3.1,comint
    6d5
    < SETTINGS=/home/user/settings.xml
    9c8
    < SHLVL=1
    > SHLVL=0
    14a14
    > PAGER=cat
    16d15
    < PAGER=/usr/bin/pager
    19d17
    < COLORTERM=gnome-terminal
    25c23
    < WINDOWID=14680069
    > DESKTOP_AUTOSTART_ID=1020ce948b944a88113395253627645060000001863000
    < TERM=xterm
    > TERM=dumb
    

我可以在emacs-ess中从R中访问SETTINGS吗?

  1. 或者,我可以将设置导出到我可以访问的某个地方吗?

你是如何启动Emacs的?如果你在bash shell中启动(带有环境变量设置),并从那里启动Emacs,它应该可以工作。目前看来,父进程没有这个环境变量(从Gnome shell或类似的地方启动)。 - Matthew Lundberg
@MatthewLundberg 我更新了我的答案(请参阅第3点)。从终端打开有效。从应用程序菜单、Gnome-do或键盘快捷方式调用 /usr/bin/emacs23 %F 打开无效。 - Abe
4个回答

3

我不知道R和自定义环境变量,但我已经在emacs中将PATH变量设置为与我的bashrc中相同的值。我修改了我的代码以解决你的问题,请试用并告诉我是否有效。

;; set env variable in Emacs
(getenv "SETTINGS")
(setenv "SETTINGS" "/home/user/settings.xml")

原始代码(用于PATH)是:

;; Emacs has its own path variable
(getenv "PATH")
 (setenv "PATH"
(concat
 "/usr/local/texlive/2011/bin/x86_64-linux" ":"
(getenv "PATH")))

3

当启动xsession时,可能不会读取.bashrc文件。可以尝试添加以下内容:

export SETTINGS=/home/user/settings.xml

在启动X会话时,可以在.xsessionrc.gnomerc(如果您使用gnome)中设置。这些文件会在启动时加载。


它们可能比xsessionrc更好,因为它们在通过ssh登录时被读取。 - Rémi

0
如果您在emacs中启动R会话,则R会话将具有与emacs相同的环境变量。因此,您应该首先确保以这种方式启动emacs,使其环境包含您的SETTINGS变量。这样,您在emacs内部启动的R会话也将在其环境中具有SETTINGS。如何实现这一点取决于您的系统。

我的系统是Ubuntu和RedHat;你有什么进一步的建议吗?我如何在emacs中查看环境?如果我使用M-x term在emacs中打开一个bash终端,变量是存在的。 - Abe

0

你可以放置

SETTINGS <- "/home/user/settings.xml"

.Rprofile中作为解决方法。

那将是一个合适的解决方法,除非我希望能够在“R --vanilla”模式下访问该变量。 - Abe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接