2017-08-04 54 views
0

我喜欢Rstudio的'查找文件'功能,您可以在其中搜索指定目录中所有文件中的文本,但我讨厌指定搜索目录和文件类型的方式,您必须单击并指向, !Rstudio的“查找文件”是否有R版本?

有没有人知道在R控制台这样做的简单方法?

+0

只需在windows上使用grep on unix或findstr,通过R的'system'命令调用? – RockScience

+0

你也可以尝试使用记事本++,我认为他们有类似的功能 – zwep

回答

0
fif <- function(what, where=".", in_files="\\.[Rr]$", recursive = TRUE, 
       ignore.case = TRUE) { 

    fils <- list.files(path = where, pattern = in_files, recursive = recursive) 

    found <- FALSE 

    file_cmd <- Sys.which("file") 

    for (fil in fils) { 

    if (nchar(file_cmd) > 0) { 
     ftype <- system2(file_cmd, fil, TRUE) 
     if (!grepl("text", ftype)[1]) next 
    } 

    contents <- readLines(fil) 

    res <- grepl(what, contents, ignore.case = ignore.case) 
    res <- which(res) 

    if (length(res) > 0) { 

     found <- TRUE 

     cat(sprintf("%s\n", fil), sep="") 
     cat(sprintf(" % 4s: %s\n", res, contents[res]), sep="") 

    } 

    } 

    if (!found) message("(No results found)") 

} 

在我gdns包导致顶层运行

> fif("map") 
在控制台

R/dkim.r 
    11: #' purrr::map_df(dkim_rec, .parse_dkim) 
    21: #'  purrr::map_df(~{ 
R/gdns-package.r 
    29: #' @importFrom purrr safely map map_df %||% %>% 
R/gdns.r 
    102: results <- map(entities, gdns::query, type=type, edns_client_subnet=edns_client_subnet) 
    103: map_df(results, "Answer") 
R/spf.r 
    11: purrr::map(spf_rec, .split_spf) 
    76: purrr::map(split_spf(spf_rec), function(x) { 
    84: purrr::map(split_spf(spf_rec), function(x) { 
    92: purrr::map(split_spf(spf_rec), function(x) { 
    100: purrr::map(split_spf(spf_rec), function(x) { 
    108: purrr::map(split_spf(spf_rec), function(x) { 
在控制台

如果没有找到匹配的文件what它会告诉你这么:

> fif("python") 
(No results found) 

保持功能在您的~/.Rprofile,它会在所有非香草的R会话。

+0

我试图在Windows上,它不工作,我认为这个问题可能在Sys.which命令?试图在这里进行调试,但如果您在此期间有一个快速解决方案,我会很感激。对不起,我应该说在哪个系统中我打算使用它,我的坏。 感谢您的答案,但功能看起来很棒! – RBA

+0

尝试安装https://cran.r-project.org/bin/windows/Rtools/installer.html,然后尝试该功能。 – hrbrmstr

相关问题