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

时间:2017-05-31 03:34:48

标签: r function

我在下面的简单函数中使用<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict> 弹出一个Windows类型的屏幕,供用户选择函数中生成的choose.dir()文件的工作目录。

问题

但是,我想知道如何才能让这个png仅在第一次运行时弹出? (并非每次用户都想运行该功能)

现在,每次运行该功能时都会弹出choose.dir()窗口。

choose.dir()

1 个答案:

答案 0 :(得分:3)

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

## 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()

修改

我同意@MrFlick最小化副作用。最好不要改变工作目录。您可以通过将choose.dir返回的路径传递给图形设备来实现此目的。此外,如果您不想在函数外部初始化全局变量,则只需检查变量是否存在,而不是检查它是否为NA。这是稍微修改过的代码:

Pch = function(n = 5){
    ## Check if a path has been chosen. If not prompt user:
    if (!exists("pathForPlots", where = .GlobalEnv)){
        .GlobalEnv$pathForPlots <- choose.dir() 
    }

    ## Produce your plots in the chosen path (witout changing the wd):
    for(i in 1:n) {     
        png(file.path(.GlobalEnv$pathForPlots, paste0("plot_", i, ".png")), 
                width = 1200, height = 1300, res = 200)     
        plot(rnorm(1e2))        
        dev.off()       
    }
}