如何解释RStudio启动时在.Rprofile中加载的包中重定义base::setwd()时出现的错误?

oknrviil  于 2023-07-31  发布在  其他
关注(0)|答案(1)|浏览(127)

设置

灵感来源于此question
我在一个名为consoleR的软件包中有一些工具。
在这个包中,一个setwd函数屏蔽了base::setwd,以便在提示符中显示当前目录,如下所示:

## file consoleR/R/setwd.R
#' @export
setwd <- function(...) {
  base::setwd(...)
  current_dir <- basename(getwd())
  options(prompt = paste(current_dir, " > "))
}

字符串
我在.Rprofile中的每个会话中加载该包:

## file ~/.Rprofile
if(interactive()) {
  library(consoleR, warn.conflicts = FALSE)
  setwd(getwd()) ## initializing the prompt
}

问题

当我从nix-terminal启动R时,一切正常,但当我启动RStudio时,我得到了一个无法解释的错误:

R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.

Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.

Error in base::setwd(...) : character argument expected
project_dir >

努力

然后我使用traceback(),得到:

project_dir > traceback()
5: base::setwd(...) at setwd.R#10
4: setwd(owd)
3: .rs.onAvailablePackagesStale(reposString)
2: .rs.availablePackages()
1: .rs.rpc.discover_package_dependencies("353B2D06", ".R")
rstudio-available-packages-3178bc4c5ea9a2  >


请注意,在调用traceback之前和之后,提示符显示的是另一个目录,而不是当前目录。
当前目录实际上是我的$HOME目录。
这是怎么回事

w8biq8rn

w8biq8rn1#

常规的setwd返回一个字符串或者NULL是工作目录不可用。你的setwd没有,因为最后一条语句是对options的调用,它返回一个list。因此,以下内容可能会解决此问题:

## file consoleR/R/setwd.R
#' @export
setwd <- function(...) {
  res <- base::setwd(...)
  current_dir <- basename(getwd())
  options(prompt = paste(current_dir, " > "))
  res
}

字符串
编辑:setwdoptions的返回值通常用于在之后设置目录:

function(...) {
  olddir <- setwd(newdir)
  on.exit(setwd(olddir))
  # do stuff
}


然后,在您的示例中调用的setwd将获得一个解释错误消息的列表。

相关问题