file.choose() 块 tcltk::tk_choose.files() 在 R

file.choose() blocks tcltk::tk_choose.files() in R

我今天问了一个类似的问题,但是没能得到肯定的回答。不过我确实得到了使用 browser() 的建议。

我的代码片段如下:

library(tcltk)

obs1 <- TRUE
obs2 <- FALSE

if (obs1) {
  if (obs2) {
    file.choose()
 } else {
    file.names <- tk_choose.dir(caption = "Select the folder where files are located")
    for (i in 1:length(file.names)) {
      x <- read.csv(file = file.names[i])
    }
   }
 }

问题是 file.choose() 调用的弹出窗口 window 阻塞了 tk_choose.dir() 调用的 window。

根据上述所需条件,任何时候都只能出现一个 window。

我做了一些调查,并在几年前在 RNabble 上发现了这个旧的未回答的 post:

https://r.789695.n4.nabble.com/Bringing-tk-choose-files-to-front-td4657938.html

我相信这也是我遇到的问题。

关于如何阻止 R 一次打开两个 windows 有什么想法吗?

我可能误解了你的问题,但你似乎没有正确使用函数 tk_choose.dir。它 returns 一个带有目录名称的字符串,但您试图循环遍历它,就好像它是一个文件名向量一样。

以下代码按预期运行,启动单个 window 允许我选择目录,然后 returns 由该目录中的所有 csv 文件组成的数据帧列表:

x <- list()
if (obs1) {
  if (obs2) {
    file.choose()
 } else {
    Dir <- tk_choose.dir(caption = "Select the folder where files are located")
    file.names <- paste0(Dir, "/", list.files(Dir, pattern = "*.csv"))
    for (i in 1:length(file.names)) 
    {
      x[[i]] <- read.csv(file = file.names[i])
    }
   }
}

在选择一个包含单个 csv 的目录后,我得到:

str(x)
List of 1
 $ :'data.frame':   107 obs. of 4 variables:
  ..$ unit          : Factor w/ 2 levels "Barnsley","Sheffield": 2 2 2 2 2 2 2 2 2 2 ...
  ..$ sex           : Factor w/ 2 levels "Female","Male": 2 2 1 2 1 1 2 2 1 1 ...
  ..$ age           : int [1:107] 47 48 19 66 67 83 38 40 84 68 ...
  ..$ arrivals      : Factor w/ 50 levels "2015-10-16 00:00:00",..: