i <- 1 
while (i <= length(files)) {
  start <- i 
  end <- start + 3
  
  v <- files[start:end]
  y <- fname[start:end]
  date_range <- substr(y[1], 7, 23)
  html_block <- make_div(v, date_range)
  
  top <- readLines("header.html")
  bottom <- readLines("footer.html")
  
  
  # This will write just the div block
  write(x = html_block, file = paste0(date_range, "-block.html"))
  
  # This will write a working website
  write(x = c(top, "<body>", html_block, "</body>", bottom), 
        file = paste0(date_range, "-website.html"))
  
  i <- i + 4
}

तो, यह लिंक एक संदर्भ प्रदान करेगा मैं यहां कैसे पहुंचा। और उपरोक्त कोड वास्तव में वही कर रहा है जो मैं चाहता हूं। लक्ष्य इसके लिए मेरे पास मौजूद फाइलों की लंबी सूची के माध्यम से लूप करना था और फिर प्रत्येक फ़ाइल के लिए एक div बनाना था जिसका एकमात्र अंतर फ़ाइल प्रकार है (यानी फ़ाइल नाम में बाकी सब कुछ समान था)। हालाँकि, यह ऐसा नहीं कर रहा है क्योंकि यह हर 4 फाइलों को लेता है और उन्हें एक साथ रखता है। इसके साथ मुद्दा यह है कि हर 4 फाइलें एक ही फाइल की नहीं होती हैं (उदाहरण के लिए कुछ सिर्फ 2 या 3 हैं; उदाहरण के लिए नीचे fname देखें)। तो मैं क्या सोच रहा था कि क्या प्रत्येक फ़ाइल नाम के माध्यम से चक्र करने का कोई तरीका है और देखें कि क्या x से y के वर्ण समान हैं, और यदि ऐसा है, तो उन्हें एक साथ समूहीकृत किया जा सकता है और फिर आगे।

# fname[1:10]
fname <- c("TOR-D-18580907-18580908.tif",                       
"TOR-D-18580907-18580908.tif-FailToProcess-Data.RDS",
"TOR-D-18580907-18580908.tif-FailToProcess-Plot.png",
"TOR-D-18580907-18580908.tif.png",                   
"TOR-D-18580908-18580909.tif",                       
"TOR-D-18580908-18580909.tif-FailToProcess-Data.RDS",
"TOR-D-18580908-18580909.tif-FailToProcess-Plot.png",
"TOR-D-18580908-18580909.tif.png",                   
"TOR-D-18580910-18580911.tif",                       
"TOR-D-18580910-18580911.tif-FailToProcess-Data.RDS")

Fname के पहले १० तत्व (एक वेरिएबल जिसमें सभी फ़ाइल नाम शामिल हैं जो १० से अधिक है) ऊपर प्रदर्शित किया गया है। क्या मेरे लिए यह जांचने का कोई तरीका है कि ७वें से २४वें तत्व (यानी १८५८०९०७-१८५८०९०८ जो कि तारीख है) निम्नलिखित एक से मेल खाता है और, यदि हां, तो क्या उन्हें एक साथ समूहीकृत किया जा सकता है और फिर हर एक फाइल के लिए उस चक्र को जारी रख ?

1
Nathan Drake 12 जुलाई 2021, 22:07

1 उत्तर

सबसे बढ़िया उत्तर

एक वैकल्पिक समाधान जो आपके पास पहले से मौजूद है, वह अद्वितीय डेटा-श्रेणियों का एक वेक्टर बनाना होगा, और फिर प्रत्येक डेटा श्रेणी के लिए फ़ाइलों के समूह को निकालना और फिर अपने लूप में कार्यों को जारी रखना होगा:

library(stringr)
library(dplyr)
fname <- c("TOR-D-18580907-18580908.tif",                       
           "TOR-D-18580907-18580908.tif-FailToProcess-Data.RDS",
           "TOR-D-18580907-18580908.tif-FailToProcess-Plot.png",
           "TOR-D-18580907-18580908.tif.png",                   
           "TOR-D-18580908-18580909.tif",                       
           "TOR-D-18580908-18580909.tif-FailToProcess-Data.RDS",
           "TOR-D-18580908-18580909.tif-FailToProcess-Plot.png",
           "TOR-D-18580908-18580909.tif.png",                   
           "TOR-D-18580910-18580911.tif",                       
           "TOR-D-18580910-18580911.tif-FailToProcess-Data.RDS")

# create a vector of unique date ranges
(date_range_unique_vec <- str_sub(fname, start = 7, end = 23) %>% 
    unique())

for (each_date_range in date_range_unique_vec) {
  
  # extract group of file names for each unique date range
  group_fnames <- fname[str_detect(fname, each_date_range)]
  
  { # from here!!
    html_block <- make_div(group_fnames, each_date_range)
    top <- readLines("header.html")
    bottom <- readLines("footer.html")
    
    # This will write just the div block
    write(x = html_block, file = paste0(each_date_range, "-block.html"))
    
    # This will write a working website
    write(x = c(top, "<body>", html_block, "</body>", bottom),
          file = paste0(each_date_range, "-website.html"))
    
  }# to here, I cannot run locally.  
  

  # 
  cat(each_date_range, "\n")
  cat(group_fnames, "\n")
  cat("\n")
}

नोट: मैं अपने कंप्यूटर में लूप के बीच में वैकल्पिक { } ब्लॉक की जांच नहीं कर सकता। जबकि मुझे लगता है कि यह ठीक होना चाहिए, हो सकता है कि आपको इसे थोड़ा अनुकूलित करना पड़े।

1
Marcelo Avila 12 जुलाई 2021, 19:38