2012-09-13 19 views
11

To jest naprawdę zaczynają bug me ... Próbowałem kilka sposobów i żaden nie wydają się działaćzwalczaniu instalują wyjścia w R

mam Uruchamianie instalacji z funkcji, która generuje wiele niepotrzebnych wiadomości, że chciałbym stłumić, ale wszystkie metody, które próbowałem to zrobić, nie zadziałały.

Kawałek kodu, który próbuję tłumić, to: install_github('ROAUth', 'duncantl'), wymaga wcześniejszego załadowania pakietu devtools.

Zresztą próbowałem invisible, capture.output i sink, z których żaden pracy ... a może ja nie korzystania z nich prawidłowo ... albo sposób ... jakieś pomysły?

+3

być może 'suppressMessages() 'lub' suppressPackageStartupMessages() 'jest tym czego potrzebujesz? – Chase

+1

@Chase ma rację. Twoja funkcja w drugim pytaniu jest nieco zawikłana i nie powinna wywoływać 'install_github()' za każdym razem. Zobacz tam moją odpowiedź. – Maiasaura

Odpowiedz

9

suppressMessages spowoduje wyłączenie niektórych komunikatów (tych, które zostały wydrukowane przez połączenia z numerem message), ale nie wszystkie.

Reszta wiadomości pochodzi z wyrzuconego połączenia do R CMD INSTALL za pośrednictwem funkcji system2. Myślę, że dzieje się tak dlatego, że wszystkie zwykłe rzeczy, które wypróbowałeś (sink, capture.output itd.) Nie działają. Zauważ, że funkcja system2 jest dostarczana z argumentami stderr i stdout, które po przełączeniu na FALSE wyłączają wszystkie te wiadomości. Niestety, system2 domyślnie używa stdout = "" i stderr = "" i wydaje się, że nie ma możliwości uzyskania dostępu do tych argumentów za pośrednictwem pakietu devtools.

Jednym ze sposobów, w jaki udało mi się uruchomić bez żadnych komunikatów, jest chwilowe zastąpienie funkcji system2 w środowisku podstawowym. To nie jest szczególnie elegancki, ale to działa:

# store a copy of system2 
assign("system2.default", base::system2, baseenv()) 

# create a quiet version of system2 
assign("system2.quiet", function(...)system2.default(..., stdout = FALSE, 
                stderr = FALSE), baseenv()) 

# overwrite system2 with the quiet version 
assignInNamespace("system2", system2.quiet, "base") 

# this is now message-free: 
res <- eval(suppressMessages(install_github('ROAUth', 'duncantl'))) 

# reset system2 to its original version 
assignInNamespace("system2", system2.default, "base") 
+0

Zastosowałem ten sam pomysł do 'system' i' install.packages' po wypróbowaniu wszystkiego innego. Znakomity. – piccolbo

2

Inną techniką byłoby załatać funkcje devtools tak, że pozwalają one przekazać stdout argument system2. Również niezbyt elegancko, ale być może uda ci się przekonać autorów paczek do zmodyfikowania w ten sposób devtools. Oto moje połatany build i install funkcje:

library(devtools) 

# New functions. 
my.install<-function (pkg = ".", reload = TRUE, quick = FALSE, args = NULL, ...) 
{ 
    pkg <- as.package(pkg) 
    message("Installing ", pkg$package) 
    devtools:::install_deps(pkg) 
    built_path <- devtools:::build(pkg, tempdir(),...) # pass along the stdout arg 
    on.exit(unlink(built_path)) 
    opts <- c(paste("--library=", shQuote(.libPaths()[1]), sep = ""), 
     "--with-keep.source") 
    if (quick) { 
     opts <- c(opts, "--no-docs", "--no-multiarch", "--no-demo") 
    } 
    opts <- paste(paste(opts, collapse = " "), paste(args, collapse = " ")) 
    devtools:::R(paste("CMD INSTALL ", shQuote(built_path), " ", opts, sep = ""),...) # pass along the stdout arg 
    if (reload) 
     devtools:::reload(pkg) 
    invisible(TRUE) 
} 

my.build<-function (pkg = ".", path = NULL, binary = FALSE, ...) 
{ 
    pkg <- as.package(pkg) 
    if (is.null(path)) { 
     path <- dirname(pkg$path) 
    } 
    if (binary) { 
     cmd <- paste("CMD INSTALL ", shQuote(pkg$path), " --build", 
      sep = "") 
     ext <- if (.Platform$OS.type == "windows") 
      "zip" 
     else "tgz" 
    } 
    else { 
     cmd <- paste("CMD build ", shQuote(pkg$path), " --no-manual --no-resave-data", 
      sep = "") 
     ext <- "tar.gz" 
    } 
    devtools:::R(cmd, path, ...) # pass along the stdout arg 
    targz <- paste(pkg$package, "_", pkg$version, ".", ext, sep = "") 
    file.path(path, targz) 
} 

# Patch package. 
unlockBinding("install", as.environment("package:devtools")) 
unlockBinding("build", as.environment("package:devtools")) 
assignInNamespace('install', my.install, ns='devtools', envir=as.environment("package:devtools")); 
assignInNamespace('build', my.build, ns='devtools', envir=as.environment("package:devtools")); 
lockBinding("install", as.environment("package:devtools")) 
lockBinding("build", as.environment("package:devtools")) 

# Run with no messages. 
suppressMessages(install_github('ROAUth','duncantl',stdout=NULL)) 

Zasadniczo, to przechodzą wzdłuż ... w trzech miejscach, dwa razy w funkcji install, a raz w funkcji build.

3

Oto kolejna możliwość. Zaletą jest to, że nie trzeba zresetować system2 po wywołaniu install_github: system2 będzie nadal wykazują swoje zachowanie domyślne dla wszystkich połączeń wyjątkiem te zainicjowane przez wywołanie install_github():

# store a copy of system2 
assign("system2.default", base::system2, baseenv()) 

# create a quiet version of system2 
assign("system2.quiet", function(...)system2.default(..., stdout = FALSE, 
                stderr = FALSE), baseenv()) 
# redefine system2 to use system2.quiet if called from "install_github" 
assignInNamespace("system2", 
    function(...) { 
     cls <- sys.calls() 
     from_install_github <- 
      any(sapply(cls, "[[", 1) == as.name("install_github")) 
     if(from_install_github) { 
      system2.quiet(...) 
     } else { 
      system2.default(...) 
     }}, 
    "base") 


## Try it out 
library(devtools) 
suppressMessages(install_github('ROAUth', 'duncantl')) 
Powiązane problemy