【问题标题】:Showing function arguments in order in an R shell在 R shell 中按顺序显示函数参数
【发布时间】:2021-03-23 15:01:27
【问题描述】:

当我从终端打开R 时,我可以使用 Tab 键来自动完成函数和对象。通过在函数和( 之后按 Tab 键,函数参数将被列出。但是,在 Ubuntu 中,这些参数似乎是根据它们的声明方式排序的;在macos 中,它们按字母顺序排列。

MacOs 下:

> findInterval(
all.inside=        left.open=         rightmost.closed=  vec=               x= 

在 Ubuntu 下:

> findInterval(
x=                 vec=               rightmost.closed=  all.inside=        left.open=

我想在我的 Mac 上使用 Ubuntu 行为。我从终端通过man readline 查看了readline 选项(不确定是否相关),但找不到任何有用的东西。

【问题讨论】:

  • 在启动 R 之前您是否在终端中尝试过:compgen -o nosort
  • 上面写着-bash: compgen: nosort: invalid option name。如果我制作 compgen -h 并且没有 man 看起来可用,我会得到 compgen: usage: compgen [-abcdefgjksuv] [-o option] [-A action] [-G globpat] [-W wordlist] [-P prefix] [-S suffix] [-X filterpat] [-F function] [-C command] [word]
  • 令人惊讶,但我在 Debian 上尝试过,而不是 MacOS,请参阅 programmable completion builtins
  • 我也在 Ubuntu 上尝试了相同的输出(但是,我当然希望在 Mac 上进行更改)。
  • 我怀疑 R 控制台不会继承 shell 自动完成行为,即使从终端 shell 窗口启动也是如此。我想知道您是否应该查看 utils 包中的 ?rcompgen 页面? (我们显然没有相同的设置,因为我在终端启动的会话中没有自动完成。我只在 Rstudio 中获得自动完成的变化和在 R.app 中的自动提示)。

标签: r macos readline


【解决方案1】:

要求

  • 在 macOS 下通过终端打开 R
  • 自动补全根据函数参数的声明顺序对其进行排序

如您所见,R 在安装 R-4.0.4.pkg 时按字母顺序排列参数。但是,当 R 与 Homebrew 一起安装时,它们会以预期的顺序显示。

因此,一种可能的解决方案是卸载 R 并通过 Homebrew 安装它。

卸载 R

rm /usr/local/bin/{R,RScript}
sudo rm -r /Applications/R.app
sudo rm -r /Library/Frameworks/R.framework
sudo pkgutil --regexp --forget 'org\.R-project*' 

通过 Homebrew 安装 R

brew install R

对我来说,它显示某些目录(如 /usr/local/share/info)对我的用户不可写的错误。复制/粘贴 brew 推荐的内容,例如:

sudo chown -R $(whoami) /usr/local/lib/pkgconfig /usr/local/share/info /usr/local/share/man/man3 /usr/local/share/man/man5

然后重复命令:

brew install R

这次成功了,它还安装了所有依赖项,如 openblas、readline、openssl@1.1 等。

现在,当您启动 R 时,它会显示一系列警告,例如 Setting LC_COLLATE failed。假设您使用的是 zsh,创建或编辑 ~/.zshrc 并添加该行

export LC_ALL=en_US.UTF-8

测试

现在打开一个新的终端窗口并输入 R。如果您使用带有 findInterval( 的自动完成功能,您将看到预期的行为,请参见屏幕截图:

为什么两种安装方式不同?

您可以查看 brew 与 R-4.0.4.pkg 变体的配置。对于 brew,您可以在 /usr/local/Cellar/r/4.0.4_2/lib/R/etc/Makeconf 中找到它,它看起来像这样:

configure  '--prefix=/usr/local/Cellar/r/4.0.4_2' '--enable-memory-profiling' '--without-cairo' '--without-x' '--with-tcl-config=/usr/local/opt/tcl-tk/lib/tclConfig.sh' '--with-tk-config=/usr/local/opt/tcl-tk/lib/tkConfig.sh' '--with-aqua' '--with-blas=-L/usr/local/opt/openblas/lib -lopenblas' '--enable-R-shlib' '--disable-java' 'PKG_CONFIG_PATH=/usr/local/opt/gmp/lib/pkgconfig:/usr/local/opt/isl/lib/pkgconfig:/usr/local/opt/mpfr/lib/pkgconfig:/usr/local/opt/jpeg/lib/pkgconfig:/usr/local/opt/libpng/lib/pkgconfig:/usr/local/opt/openblas/lib/pkgconfig:/usr/local/opt/pcre2/lib/pkgconfig:/usr/local/opt/readline/lib/pkgconfig:/usr/local/opt/openssl@1.1/lib/pkgconfig:/usr/local/opt/tcl-tk/lib/pkgconfig:/usr/local/opt/xz/lib/pkgconfig' 'PKG_CONFIG_LIBDIR=/usr/lib/pkgconfig:/usr/local/Homebrew/Library/Homebrew/os/mac/pkgconfig/10.15' 'CC=clang' 'CFLAGS=-Wno-implicit-function-declaration' 'LDFLAGS=-L/usr/local/opt/gettext/lib -L/usr/local/opt/readline/lib -L/usr/local/opt/xz/lib' 'CPPFLAGS=-I/usr/local/opt/gettext/include -I/usr/local/opt/readline/include -I/usr/local/opt/xz/include' 'CXX=clang++' 'OBJC=clang'

对于 Framework R-4.0.4.pkg 变体,您可以在文件 /Library/Frameworks/R.framework/Resources/etc/Makeconf 中找到信息:

configure  'CC=clang -mmacosx-version-min=10.13' 'CXX=clang++ -mmacosx-version-min=10.13' 'OBJC=clang -mmacosx-version-min=10.13' 'FC=gfortran -mmacosx-version-min=10.13' 'F77=gfortran -mmacosx-version-min=10.13' 'CFLAGS=-Wall -g -O2' 'CXXFLAGS=-Wall -g -O2' 'OBJCFLAGS=-Wall -g -O2' 'FCFLAGS=-Wall -g -O2' 'F77FLAGS=-Wall -g -O2' '--enable-memory-profiling' '--x-libraries=/opt/X11/lib' '--x-includes=/opt/X11/include' '--enable-R-framework' '--build=x86_64-apple-darwin17.0' 'build_alias=x86_64-apple-darwin17.0' 'PKG_CONFIG_PATH=/usr/lib/pkgconfig:/usr/local/lib/pkgconfig:/opt/X11/lib/pkgconfig'

注意 brew 变体中 readline 和 gettext 的 CPPFLAGS 和 LDFLAGS。

测试:将 CPPFLAGS/LDFLAGS 添加到 R-4.0.4.pkg 变体

只是为了证实需要这些编译/链接标志的理论,R 是从这里的源代码构建的。

首先,如果系统中不存在某些依赖项,则需要它们。

Xcode
XQuartz-2.8.0.dmg from https://www.xquartz.org

brew install gfortran
brew install xz
brew install cairo
brew install pcre2
brew install libtiff libjpeg

从其中一个镜像下载源代码 R-4.0.4.tar.gz。

修改后的配置命令现在看起来像这样:

./configure  'CC=clang -mmacosx-version-min=10.13' 'CXX=clang++ -mmacosx-version-min=10.13' 'OBJC=clang -mmacosx-version-min=10.13' 'FC=gfortran -mmacosx-version-min=10.13' 'F77=gfortran -mmacosx-version-min=10.13' 'CFLAGS=-Wall -g -O2' 'CXXFLAGS=-Wall -g -O2' 'OBJCFLAGS=-Wall -g -O2' 'FCFLAGS=-Wall -g -O2' 'F77FLAGS=-Wall -g -O2' '--enable-memory-profiling' '--x-libraries=/opt/X11/lib' '--x-includes=/opt/X11/include' '--enable-R-framework' '--build=x86_64-apple-darwin17.0' 'build_alias=x86_64-apple-darwin17.0' 'PKG_CONFIG_PATH=/usr/lib/pkgconfig:/usr/local/lib/pkgconfig:/opt/X11/lib/pkgconfig' 'CPPFLAGS=-I/usr/local/opt/gettext/include -I/usr/local/opt/readline/include -I/usr/local/opt/xz/include' 'LDFLAGS=-L/usr/local/opt/gettext/lib -L/usr/local/opt/readline/lib -L/usr/local/opt/xz/lib' 'CFLAGS=-Wno-implicit-function-declaration'

之后就可以打电话了

make

确保在执行最后一步之前已创建备份。最后用这个命令

sudo make install

可以创建或覆盖 /Library/Frameworks/R.framework。调用 /Library/Frameworks/R.framework/Resources/bin/R 现在会显示有关函数参数自动完成的预期行为,并提供预期的功能。

【讨论】:

  • 非常感谢您的回答。还没有测试,因为它是一个非常有影响力的解决方案,而且我有数百个软件包要重新安装。尽管如此,我还是会试一试。
  • 在我尝试这个程序之前,是否可以通过brew 进行本地安装?据我了解,我不想在/usr/local/bin 中创建链接,这样我就可以继续当前的安装,测试它是否有效,并在brew R 上逐步安装所有软件包。
  • 我建议的第一件事是进行备份。您可以使用 brew 安装 R,它会检测到 /usr/local/bin 中存在 R 和 Rscript 而不会覆盖它。然后,您可以调用 /usr/local/Cellar/r/4.0.4_2/bin/R 来运行 brew 安装的版本。或者,如果您只是想尝试一下,您可以使用虚拟化解决方案(例如,Virtualbox、VMware Fusion 或 Parallels)。
  • 我尝试从 brew 安装 R,它实际上可以完成。然而,不幸的是,有几个缺点。 1)从源代码安装新软件包,可能会出现很多问题。 2)依赖外部库的包更难安装,因为找不到路径。 3) 许多capabilities() 未启用(jpegpngcairo 等)。底线:如果你有一台新的 Mac,你可以从 brew 安装 R 并尝试调整一切;但是如果你已经安装了macos包,就很难再回去了。
  • 这是您回答中的一个很好的补充。实际上,如果您不执行 sudo make install 从源安装不是侵入性的(这是我在 Linux 上使用的方式),您可以手动创建指向不同 R 版本/安装的符号链接。尽管如此,我猜它仍然存在依赖问题:一些包需要外部库(例如rgdal),这些库可能无法从源安装中“看到”。我也会尝试这条路。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-15
  • 2018-11-29
  • 1970-01-01
  • 2021-10-24
  • 1970-01-01
  • 2020-05-14
  • 2016-06-11
相关资源
最近更新 更多