如何将 R CMD 检查的输出发送到文件或变量?
How can I send the output of R CMD check to a file or variable?
上下文:试图有效地解决我的 no visibile binding CMD 检查问题。
两种口味我都试过了captureOutput
:
cmd_output <- R.utils::captureOutput(devtools::check(args="--no-tests"))
cmd_output <- utils::capture.output(devtools::check())
并下沉
sink("cmd_output.txt")
devtools::check(args="--no-tests")
sink()
unlink("cmd_output.txt")
无济于事。当我想要 CMD 注释和警告时,我最终得到 devtools::document()
的输出。
这是我在构建和检查包时遵循的非 devtools 工作流程。请注意,检查必须在 tarball 上执行,而不是包目录,因此您必须先构建。 devtools 以不可见的方式执行此操作,但您必须将其显式化。
假设您位于包含包目录的目录中(即包目录的上一级目录)。
pkg <- "packagename"
version <- read.dcf(paste('.',pkg,'DESCRIPTION',sep='/'))[,'Version']
# build
system2("R", paste0("CMD build ", pkg), stdout = "build.txt", stderr = "build.txt")
# check
system2("R", paste0("CMD check ", pkg, "_", version, ".tar.gz --as-cran"), stdout = "check.txt", stderr = "check.txt")
# install
system2("R", paste0("CMD INSTALL -l ",Sys.getenv('R_HOME'),"/library ", pkg), stdout = "install.txt", stderr = "install.txt")
这会将每个命令的输出转储到其自己的文本文件中。
您还可以在单独的过程中指定 wait = FALSE
到 运行 这些,而无需占用您的 R。如果您的检查需要很长时间,这可能会有用,因为您可以继续进行其他工作R内
Hadley 还建议,如果您使用 check()
,您可以访问由 R CMD check
自动生成的检查文件,该文件位于此处:
chk <- check()
# install log
file.path(chk, paste0(as.package(".")$package, ".Rcheck"), "00install.out")
# check log
file.path(chk, paste0(as.package(".")$package, ".Rcheck"), "00check.log")
那个可能多了也未必更方便
可能并非在所有情况下都有用,但一个快速简便的解决方案是简单地 reprex()
check()
的输出:
check_output <- reprex::reprex(devtools::check(), wd = ".")
请注意,如果您不希望输出以 "#>"
为前缀,则可以使用 comment = ""
。
编辑:
我在尝试解决相同问题时找到了此解决方案 - 有效解决 'no visible binding' 警告。对于其他想要做同样事情的人,这里有一个函数可以提取变量的字符向量,可以将其放入对 globalVariables()
:
的调用中
# Helper function to get global variables to specify before running devtools::check()
get_missing_global_variables <- function(wd = getwd()) {
# Run devtools::check() and reprex the results
check_output <- reprex::reprex(input = sprintf("devtools::check(pkg = '%s', vignettes = FALSE)\n", wd),
comment = "")
# Get the lines which are notes about missing global variables, extract the variables and
# construct a vector as a string
missing_global_vars <- check_output %>%
stringr::str_squish() %>%
paste(collapse = " ") %>%
stringr::str_extract_all("no visible binding for global variable '[^']+'") %>%
`[[`(1) %>%
stringr::str_extract("'.+'$") %>%
stringr::str_remove("^'") %>%
stringr::str_remove("'$") %>%
unique() %>%
sort()
# Get a vector to paste into `globalVariables()`
to_print <- if (length(missing_global_vars) == 0) {
"None"
} else {
missing_global_vars %>%
paste0('"', ., '"', collapse = ", \n ") %>%
paste0("c(", ., ")")
}
# Put the global variables in the console
cat("Missing global variables:\n", to_print)
# Return the results of the check
invisible(missing_global_vars)
}
上下文:试图有效地解决我的 no visibile binding CMD 检查问题。
两种口味我都试过了captureOutput
:
cmd_output <- R.utils::captureOutput(devtools::check(args="--no-tests"))
cmd_output <- utils::capture.output(devtools::check())
并下沉
sink("cmd_output.txt")
devtools::check(args="--no-tests")
sink()
unlink("cmd_output.txt")
无济于事。当我想要 CMD 注释和警告时,我最终得到 devtools::document()
的输出。
这是我在构建和检查包时遵循的非 devtools 工作流程。请注意,检查必须在 tarball 上执行,而不是包目录,因此您必须先构建。 devtools 以不可见的方式执行此操作,但您必须将其显式化。
假设您位于包含包目录的目录中(即包目录的上一级目录)。
pkg <- "packagename"
version <- read.dcf(paste('.',pkg,'DESCRIPTION',sep='/'))[,'Version']
# build
system2("R", paste0("CMD build ", pkg), stdout = "build.txt", stderr = "build.txt")
# check
system2("R", paste0("CMD check ", pkg, "_", version, ".tar.gz --as-cran"), stdout = "check.txt", stderr = "check.txt")
# install
system2("R", paste0("CMD INSTALL -l ",Sys.getenv('R_HOME'),"/library ", pkg), stdout = "install.txt", stderr = "install.txt")
这会将每个命令的输出转储到其自己的文本文件中。
您还可以在单独的过程中指定 wait = FALSE
到 运行 这些,而无需占用您的 R。如果您的检查需要很长时间,这可能会有用,因为您可以继续进行其他工作R内
Hadley 还建议,如果您使用 check()
,您可以访问由 R CMD check
自动生成的检查文件,该文件位于此处:
chk <- check()
# install log
file.path(chk, paste0(as.package(".")$package, ".Rcheck"), "00install.out")
# check log
file.path(chk, paste0(as.package(".")$package, ".Rcheck"), "00check.log")
那个可能多了也未必更方便
可能并非在所有情况下都有用,但一个快速简便的解决方案是简单地 reprex()
check()
的输出:
check_output <- reprex::reprex(devtools::check(), wd = ".")
请注意,如果您不希望输出以 "#>"
为前缀,则可以使用 comment = ""
。
编辑:
我在尝试解决相同问题时找到了此解决方案 - 有效解决 'no visible binding' 警告。对于其他想要做同样事情的人,这里有一个函数可以提取变量的字符向量,可以将其放入对 globalVariables()
:
# Helper function to get global variables to specify before running devtools::check()
get_missing_global_variables <- function(wd = getwd()) {
# Run devtools::check() and reprex the results
check_output <- reprex::reprex(input = sprintf("devtools::check(pkg = '%s', vignettes = FALSE)\n", wd),
comment = "")
# Get the lines which are notes about missing global variables, extract the variables and
# construct a vector as a string
missing_global_vars <- check_output %>%
stringr::str_squish() %>%
paste(collapse = " ") %>%
stringr::str_extract_all("no visible binding for global variable '[^']+'") %>%
`[[`(1) %>%
stringr::str_extract("'.+'$") %>%
stringr::str_remove("^'") %>%
stringr::str_remove("'$") %>%
unique() %>%
sort()
# Get a vector to paste into `globalVariables()`
to_print <- if (length(missing_global_vars) == 0) {
"None"
} else {
missing_global_vars %>%
paste0('"', ., '"', collapse = ", \n ") %>%
paste0("c(", ., ")")
}
# Put the global variables in the console
cat("Missing global variables:\n", to_print)
# Return the results of the check
invisible(missing_global_vars)
}