file.choose () блокирует tcltk :: tk_choose.files () в R - PullRequest
0 голосов
/ 05 марта 2020

Я задал похожий вопрос сегодня, но не смог получить твердый ответ. Я получил предложение использовать 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 () блокирует окно, вызываемое tk_choose.dir ().

В любое время должно отображаться только одно окно, основываясь на желаемом условии, указанном выше.

Я провел некоторое расследование и нашел этот старый пост без ответа на RNabble от нескольких лет a go:

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

и Я полагаю, что это та же проблема, что и у меня.

Есть идеи, как не дать R открыть два windows одновременно?

1 Ответ

0 голосов
/ 06 марта 2020

Возможно, я неправильно понимаю вашу проблему, но вы, похоже, неправильно используете функцию tk_choose.dir. Он возвращает строку с именем каталога, но вы пытаетесь провести через него l oop, как если бы он был вектором имен файлов.

Следующий код выполняется должным образом, открывая одно окно, которое позволяет мне чтобы выбрать каталог, затем возвращает список фреймов данных, созданных из всех файлов 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",..:
...