我在下面的简单函数中使用<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
弹出一个Windows类型的屏幕,供用户选择函数中生成的choose.dir()
文件的工作目录。
但是,我想知道如何才能让这个png
仅在第一次运行时弹出? (并非每次用户都想运行该功能)
现在,每次运行该功能时都会弹出choose.dir()
窗口。
choose.dir()
答案 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()
}
}