我有一个有几个断开组件的igraph.例如:
library(igraph)
g <- simplify(
graph.compose(
graph.ring(10),
graph.star(5, mode = "undirected")
)
) + edge("7", "8")
Run Code Online (Sandbox Code Playgroud)

在该示例中,节点9是其自己的图,节点7和8也是如此,其余的形成第三图.
我想分开处理这些,所以我想将单个igraph转换为3个igraph的列表(按连通性分割).
我破解了一些代码来实现这一目标,但它效率低下且非常糟糕.
split_graph_into_connected_subgraphs <- function(g)
{
adjacency_list <- get.adjlist(g)
connected_nodes <- lapply(
adjacency_list,
function(adjacent_nodes)
{
new_nodes <- out <- adjacent_nodes
# Keep finding nodes that are adjacent to ones we already know about,
# until we find no more
repeat
{
doubly_adjacent_nodes <- Reduce(union, adjacency_list[new_nodes])
new_nodes <- setdiff(doubly_adjacent_nodes, out)
if(length(new_nodes) == 0)
{
break
}
out <- union(out, new_nodes)
}
sort(out)
}
) …Run Code Online (Sandbox Code Playgroud) 我知道,对于一个列表,使用基本运营商建立索引时,部分匹配完成$和[[.例如:
ll <- list(yy=1)
ll$y
[1] 1
Run Code Online (Sandbox Code Playgroud)
但我仍然是一个R新手,这对我来说是新的,函数参数的部分匹配:
h <- function(xx=2)xx
h(x=2)
[1] 2
Run Code Online (Sandbox Code Playgroud)
我想了解这是如何工作的.它背后的机制是什么?这有副作用吗?我想知道如果给出了xx参数,有人可以测试一下吗?
Andrie评论后编辑:
内部R使用pmatch算法来匹配参数,这里是一个如何工作的示例:
pmatch("me", c("mean", "median", "mode")) # error multiple partial matches
[1] NA
> pmatch("mo", c("mean", "median", "mode")) # mo match mode match here
[1] 3
Run Code Online (Sandbox Code Playgroud)
但为什么R有这样的功能呢?partial unique匹配背后的基本理念是什么?
在构建包时,我收到了错误
Error in namespaceExport(ns, exports) :
undefined exports: FooBarBaz
Run Code Online (Sandbox Code Playgroud)
这是什么意思,我该如何解决?
当我训练只是使用时glm,一切正常,我甚至没有接近耗尽记忆.但是当我跑步时train(..., method='glm'),我的内存耗尽.
这是因为train为交叉验证的每次迭代存储了大量数据(或者无论trControl程序是什么)?我在看,trainControl我找不到如何防止这种...任何提示?我只关心性能总结和预测的响应.
(我知道它与存储参数调整网格搜索的每次迭代中的数据无关,因为我认为没有glm的网格.)
如何为ggplot中的不同方面指定不同的geom?
(代表@pacomet提问,谁想知道.)
我有一些包含非ASCII字符的数据,我希望将其作为rdaR包中的文件包含在内.当我R CMD check在包装上运行时,我收到警告:
Warning: found non-ASCII strings
Run Code Online (Sandbox Code Playgroud)
这阻止了它在CRAN上被允许.
关于从数据文件中删除非ASCII字符有类似的问题,但我想保留非ASCII字符.
您可以在此处获取CSV数据.我正在将它读入R并重新保存,就像rda这段代码一样:
english_monarchs <- read.csv(
wherever_you_downloaded_the_file_to,
fileEncoding = "utf8",
na.strings = ""
)
save(english_monarchs, "english_monarchs.csv")
Run Code Online (Sandbox Code Playgroud)
它name是包含非ascii值的数据集列.
head(levels(english_monarchs$name))
## [1] "Adda" "Æðelbehrt"
## [3] "Æðelberht I" "Æðelberht II and Eardwulf"
## [5] "Æðelberht II, Ælfric and Eadberht I" "Æðelberht III"
Run Code Online (Sandbox Code Playgroud)
基于编写R扩展的编码问题部分中的(不是很清楚)指导,我认为我应该将因子级别编码为UTF-8,但显而易见的方法不起作用:
Encoding(levels(english_monarchs$name)) <- "utf8" #each encoding still "unknown"
Run Code Online (Sandbox Code Playgroud)
如何使数据足够便携以便在CRAN上接受?
我正在尝试找到一种可靠的方法来查找传递给的语言环境代码Sys.setlocale.
在?Sys.setlocale帮助页面刚指出允许值是依赖于操作系统的,并给出了一些例子:
Sys.setlocale("LC_TIME", "de") # Solaris: details are OS-dependent
Sys.setlocale("LC_TIME", "de_DE.utf8") # Modern Linux etc.
Sys.setlocale("LC_TIME", "de_DE.UTF-8") # ditto
Sys.setlocale("LC_TIME", "de_DE") # Mac OS X, in UTF-8
Sys.setlocale("LC_TIME", "German") # Windows
Run Code Online (Sandbox Code Playgroud)
在Linux下,可以使用检索可能性
locales <- system("locale -a", intern = TRUE)
## [1] "C" "C.utf8" "POSIX"
## [4] "af_ZA" "af_ZA.utf8" "am_ET"
## ...
Run Code Online (Sandbox Code Playgroud)
我没有手持Solaris或Mac机器,但我猜这个输出可以通过以下方式生成:
library(stringr)
unique(str_split_fixed(locales, "_", 2)[, 1]) #Solaris
unique(str_split_fixed(locales, "\\.", 2)[, 1]) #Mac
Run Code Online (Sandbox Code Playgroud)
Windows上的语言环境更成问题:它们需要"language_country"形式的长名称,例如:
Sys.setlocale("LC_ALL", "German_Germany")
Run Code Online (Sandbox Code Playgroud)
我无法找到Windows下的语言环境列表的可靠参考.locale -a除非安装了cygwin,否则从Windows命令行调用会失败,然后返回与Linux相同的值(我猜它正在访问标准C库中的值.)
似乎没有与R打包的语言环境列表(我认为可能有类似于share/zoneinfo/zone.tab包含时区详细信息的内容).
我目前最好的策略是从Microsoft浏览此网页,并通过操作SUBLANG表的列来形成名称. …
我想只读取文本文件每行的第一个字符,忽略其余部分.
这是一个示例文件:
x <- c(
"Afklgjsdf;bosfu09[45y94hn9igf",
"Basfgsdbsfgn",
"Cajvw58723895yubjsdw409t809t80",
"Djakfl09w50968509",
"E3434t"
)
writeLines(x, "test.txt")
Run Code Online (Sandbox Code Playgroud)
我可以通过阅读所有内容readLines并使用substring获取第一个字符来解决问题:
lines <- readLines("test.txt")
substring(lines, 1, 1)
## [1] "A" "B" "C" "D" "E"
Run Code Online (Sandbox Code Playgroud)
但这似乎效率低下.有没有办法说服R只读取第一个字符,而不是丢弃它们?
我怀疑应该使用一些咒语scan,但我找不到它.替代方案可能是低级文件操作(可能有seek).
由于性能仅适用于较大的文件,因此这是一个更大的测试文件,用于进行基准测试:
set.seed(2015)
nch <- sample(1:100, 1e4, replace = TRUE)
x2 <- vapply(
nch,
function(nch)
{
paste0(
sample(letters, nch, replace = TRUE),
collapse = ""
)
},
character(1)
)
writeLines(x2, "bigtest.txt")
Run Code Online (Sandbox Code Playgroud)
更新:您似乎无法避免扫描整个文件.最好的速度增益似乎是使用更快的替代品readLines(Richard Scriven的stringi::stri_read_lines解决方案和Josh O'Brien的data.table::fread解决方案),或将文件视为二进制( …
如果我想检查变量是否继承自某个类,我可以使用is或inherits.
class(letters)
## [1] "character"
is(letters, "character")
## [1] TRUE
inherits(letters, "character")
## [1] TRUE
Run Code Online (Sandbox Code Playgroud)
我是否应该选择使用哪一种,并且它们是否会返回不同的值?
从roxygen2版本开始4.0.0,@S3method标签已被弃用,有利于使用@export.
程序包现在尝试检测函数是否为S3方法,如果认为它是一个,则自动将该行添加S3method(function,class)到NAMESPACE文件中.
问题是,如果一个函数不是一个S3方法,但它的名字包含一个.然后roxygen有时会出错,并在不应该的时候添加该行.
有没有办法告诉roxygen函数不是S3方法?
根据要求,这是一个可重复的例子.
我有一个导入的包R.oo,其中包含一个名为的函数check.arg.
library(roxygen2)
package.skeleton("test")
cat("Imports: R.oo\n", file = "test/DESCRIPTION", append = TRUE)
writeLines(
"#' Check an argument
#'
#' Checks an argument.
#' @param ... Some arguments.
#' @return A value.
#' @export
check.arg <- function(...) 0",
"test/R/check.arg.R"
)
roxygenise("test")
Run Code Online (Sandbox Code Playgroud)
现在命名空间包含该行S3method(check,arg).
check是一个S3泛型R.oo,所以roxygen试图聪明,并猜测我想check.arg成为一个S3方法.不幸的是,这些功能是无关的,所以我没有.
(为了抢占我刚刚重命名的建议check.arg:这是其他人编写的遗留代码,我已经创建了一个checkArg替代品,但我需要将其check.arg作为兼容性的弃用函数保留.)