0

有谁知道是否可以导出 R 程序的文件名/文件路径?我在 SAS 中寻找类似于“%sysfunc(GetOption(SYSIN))”的东西,它将返回 SAS 程序的文件路径(以批处理模式运行)。我可以在 R 中做类似的事情吗?

到目前为止,我能想到的最好的方法是在我使用的文本编辑器(PSPad)中使用快捷键添加文件名和当前目录。有没有更简单的方法来做到这一点?

这是我的例子:

progname<-"Iris data listing"

# You must use either double-backslashes or forward slashes in pathnames
progdir<-"F:\\R Programming\\Word output\\"
# Set the working directory to the program location
setwd(progdir)

# Make the ReporteRs package available for creating Word output
library(ReporteRs)
# Load the "Iris" provided with R
data("iris")

options('ReporteRs-fontsize'=8, 'ReporteRs-default-font'='Arial')

# Initialize the Word output object
doc <- docx()
# Add a title
doc <- addTitle(doc,"A sample listing",level=1)

# Create a nicely formatted listing, style similar to Journal
listing<-vanilla.table(iris)

# Add the listing to the Word output
doc <- addFlexTable(doc, listing)

# Create the Word output file
writeDoc( doc, file = paste0(progdir,progname,".docx"))

这在批处理和 RStudio 中都非常有效。我真的很感激一个更好的解决方案

4

1 回答 1

1

Rscript的链接 :确定@Juan Bosco 提供的执行脚本的路径包含我需要的大部分信息。它没有解决的一个问题是在 RStudio 中运行 R 程序(讨论并解决了在 RStudio 中的采购)。我发现这个问题可以用rstudioapi::getActiveDocumentContext()$path).

还值得注意的是,批处理模式的解决方案无法使用

Rterm.exe --no-restore --no-save < %1 > %1.out 2>&1

解决方案要求使用该--file=选项,例如

D:\R\R-3.3.2\bin\x64\Rterm.exe --no-restore --no-save --file="%~1.R" > "%~1.out" 2>&1 R_LIBS=D:/R/library

get_script_path这是@aprstar 发布的功能的新版本。这已被修改为也可以在 RStudio 中使用(请注意,它需要rstudioapi库。

# Based on "get_script_path" function by aprstar, Aug 14 '15 at 18:46
# https://stackoverflow.com/questions/1815606/rscript-determine-path-of-the-executing-script
# That solution didn't work for programs executed directly in RStudio
# Requires the rstudioapi package
# Assumes programs executed in batch have used the "--file=" option
GetProgramPath <- function() {
    cmdArgs = commandArgs(trailingOnly = FALSE)
    needle = "--file="
    match = grep(needle, cmdArgs)
    if (cmdArgs[1] == "RStudio") {
        # An interactive session in RStudio
        # Requires rstudioapi::getActiveDocumentContext
        return(normalizePath(rstudioapi::getActiveDocumentContext()$path))
    }
    else if (length(match) > 0) {
        # Batch mode using Rscript or rterm.exe with the "--file=" option
        return(normalizePath(sub(needle, "", cmdArgs[match])))
    } 
    else {
        ls_vars = ls(sys.frames()[[1]])
        if ("fileName" %in% ls_vars) {
            # Source'd via RStudio
            return(normalizePath(sys.frames()[[1]]$fileName)) 
        }
        else {
            # Source'd via R console
            return(normalizePath(sys.frames()[[1]]$ofile))
        }
    }
}

我把它放在我的.Rprofile文件中。现在我可以使用以下代码在批处理模式或 RStudio 中获取文件信息。我还没有尝试过使用它,source()但这也应该可以。

# "GetProgramPath()" returns the full path name of the file being executed  
progpath<-GetProgramPath()
# Get the filename without the ".R" extension
progname<-tools::file_path_sans_ext(basename(progpath))
# Get the file directory
progdir<-dirname(progpath)   
# Set the working directory to the program location
setwd(progdir)
于 2017-01-13T08:23:07.947 回答