2012-09-13 29 views
11

Điều này thực sự bắt đầu gây lỗi cho tôi ... Tôi đã thử một vài phương pháp và dường như không hoạt độngNgăn chặn kết quả cài đặt trong R

Tôi đang chạy một cài đặt từ một chức năng tạo ra nhiều thư không cần thiết mà tôi muốn ngăn chặn, nhưng tất cả các phương pháp tôi đã cố gắng thực hiện điều này đều không hiệu quả.

Mã bit mà tôi đang cố gắng chặn là: install_github('ROAUth', 'duncantl'), mã yêu cầu phải được nạp trước devtools.

Dù sao, tôi đã cố gắng invisible, capture.outputsink, không ai trong số đó làm việc ... hoặc có lẽ tôi không sử dụng chúng một cách chính xác ... một trong hai cách ... bất kỳ ý tưởng?

+3

lẽ 'suppressMessages() 'hoặc' suppressPackageStartupMessages() 'là những gì bạn muốn? – Chase

+1

@Chase là đúng. Chức năng của bạn trong câu hỏi khác là một chút phức tạp và không nên gọi 'install_github()' mỗi lần. Xem câu trả lời của tôi ở đó. – Maiasaura

Trả lời

9

suppressMessages sẽ tắt một số thư (những thư đã được in mặc dù các cuộc gọi đến message), nhưng không phải tất cả.

Phần còn lại của tin nhắn đến từ một cuộc gọi bị bóc ra tới R CMD INSTALL thông qua chức năng system2. Tôi nghĩ rằng đó là bởi vì điều này là shelled ra rằng tất cả những điều bình thường bạn đã thử (sink, capture.output, vv) không hoạt động. Lưu ý rằng chức năng system2 đi kèm với các đối số stderrstdout, nếu được chuyển thành FALSE sẽ tắt tất cả các tin nhắn đó. Thật không may, system2 sử dụng stdout = ""stderr = "" theo mặc định và dường như không có cách nào để truy cập các đối số này thông qua gói devtools.

Vì vậy, một cách mà tôi quản lý để chạy mà không có bất kỳ thư nào là tạm thời ghi đè lên chức năng system2 trong môi trường cơ sở. Đó không phải là đặc biệt thanh lịch nhưng nó hoạt động:

# 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

Tôi đã áp dụng cùng một ý tưởng cho 'system' và' install.packages' sau khi thử mọi thứ khác. Rực rỡ. – piccolbo

2

Kỹ thuật khác sẽ được vá các devtools chức năng để họ cho phép bạn để vượt qua đối số stdout để system2. Cũng không phải rất thanh lịch, nhưng có lẽ bạn có thể thuyết phục các tác giả gói sửa đổi devtools theo cách này. Dưới đây là vá của tôi buildinstall chức năng:

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)) 

Về cơ bản, bạn vượt qua dọc theo ... ở ba nơi, hai lần trong install chức năng, và một lần trong build chức năng.

3

Đây là một khả năng khác. Ưu điểm ở đây là bạn không cần phải thiết lập lại sau khi gọi system2install_github: system2 sẽ tiếp tục thể hiện hành vi mặc định của nó cho tất cả gọi trừ những khởi xướng bởi một cuộc gọi đến 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')) 
Các vấn đề liên quan