如何使'choose.dir'仅在用户第一次在R中运行函数时运行?

如何使'choose.dir'仅在用户第一次在R中运行函数时运行?,r,function,R,Function,我在下面的简单函数中使用choose.dir(),弹出一个windows类型屏幕,供用户为函数中生成的png文件选择一个工作目录 Pch = function(n = 5){ setwd(choose.dir()) ## How to make this run only the first time that user runs the function? for(i in 1:n) { png(paste0("plot_", i, ".png&q

我在下面的简单函数中使用
choose.dir()
,弹出一个windows类型屏幕,供用户为函数中生成的
png
文件选择一个工作目录

Pch = function(n = 5){

setwd(choose.dir())    ## How to make this run only the first time that user runs the function?


for(i in 1:n) {

 png(paste0("plot_", i, ".png"), width = 1200, height = 1300, res = 200)

  plot( rnorm(1e2) )

  dev.off()

    }
}

## TEST HERE:
Pch()
问题: 但是,我想知道如何让这个
choose.dir()
仅在函数第一次运行时弹出?(并非每次用户都想运行该功能)

现在,每次我运行函数时都会弹出
choose.dir()
窗口

Pch = function(n = 5){

setwd(choose.dir())    ## How to make this run only the first time that user runs the function?


for(i in 1:n) {

 png(paste0("plot_", i, ".png"), width = 1200, height = 1300, res = 200)

  plot( rnorm(1e2) )

  dev.off()

    }
}

## TEST HERE:
Pch()

您可以在全局环境中初始化标志,并在第一次调用函数时更改其值。然后让函数检查该标志,以查看函数在以下情况之前是否已被调用:

## Initialize flag in global environment:
.GlobalEnv$isDirChosen <- FALSE

Pch = function(n = 5){      
    ## Check if function has been called before:
    if (.GlobalEnv$isDirChosen == FALSE){
        setwd(choose.dir())    ## How to make this run only the first time that user runs the function?
        .GlobalEnv$isDirChosen <- TRUE  ## Change value of flag
    }

    for(i in 1:n) {         
        png(paste0("plot_", i, ".png"), width = 1200, height = 1300, res = 200)         
        plot(rnorm(1e2))            
        dev.off()           
    }
}

## TEST HERE:
Pch()

您可能不应该在函数中设置工作目录。只需使用当前工作目录或让它们将(可选)目录路径作为参数传递给函数即可。编写函数时应尽量减少“副作用”。这将使你更容易以你可能没有预料到的方式写作。但是如果您坚持,请考虑使用
options()
来存储首选项。您的
.GlobalEnv$pathForPlots
的值是多少?该文件夹是否已经存在?如果您不想在函数外部初始化
.GlobalEnv$pathForPlots
,您可以通过检查变量是否存在,而不是检查它是否为
NA
。我将相应地修改答案。谢谢!除了一件事,一切都很好。如果将参数
n
设置为,例如,
20
,该函数将生成20个png文件并将其存储在所选目录中。但是,如果在此之后,将
n
更改为任何较小的数字,例如,
10
,则该函数仅覆盖上一次运行的前10个
png
文件!因此,您仍然可以在文件夹中看到20个png文件,这非常令人困惑。换句话说,我们需要函数在执行新的函数运行时清空文件夹!