小编Ric*_*ton的帖子

如何将igraph分割成连接的子图?

我有一个有几个断开组件的igraph.例如:

library(igraph)
g <- simplify(
  graph.compose(
    graph.ring(10), 
    graph.star(5, mode = "undirected")
  )
) + edge("7", "8")
Run Code Online (Sandbox Code Playgroud)

带有多个断开组件的igraph图

在该示例中,节点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)

r igraph

23
推荐指数
1
解决办法
1万
查看次数

函数参数的部分匹配

我知道,对于一个列表,使用基本运营商建立索引时,部分匹配完成$[[.例如:

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匹配背后的基本理念是什么?

r semantics

21
推荐指数
1
解决办法
3699
查看次数

"namespaceExport中的错误(ns,exports):undefined exports"是什么意思?

在构建包时,我收到了错误

Error in namespaceExport(ns, exports) : 
  undefined exports: FooBarBaz
Run Code Online (Sandbox Code Playgroud)

这是什么意思,我该如何解决?

r exception roxygen2

21
推荐指数
2
解决办法
5362
查看次数

为什么插入符号列车占用了这么多记忆?

当我训练只是使用时glm,一切正常,我甚至没有接近耗尽记忆.但是当我跑步时train(..., method='glm'),我的内存耗尽.

这是因为train为交叉验证的每次迭代存储了大量数据(或者无论trControl程序是什么)?我在看,trainControl我找不到如何防止这种...任何提示?我只关心性能总结和预测的响应.

(我知道它与存储参数调整网格搜索的每次迭代中的数据无关,因为我认为没有glm的网格.)

memory r glm r-caret

20
推荐指数
3
解决办法
8129
查看次数

你能为ggplot中的不同方面指定不同的geom吗?

如何为ggplot中的不同方面指定不同的geom?

(代表@pacomet提问,谁想知道.)

r ggplot2

20
推荐指数
1
解决办法
6023
查看次数

使非ASCII数据适合CRAN

我有一些包含非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上接受?

portability r cran

19
推荐指数
1
解决办法
1811
查看次数

在R中获取允许的语言环境名称的可靠方法是什么?

我正在尝试找到一种可靠的方法来查找传递给的语言环境代码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表的列来形成名称. …

windows macos locale solaris r

19
推荐指数
1
解决办法
2918
查看次数

如何有效地从文本文件的每一行读取第一个字符?

我想只读取文本文件每行的第一个字符,忽略其余部分.

这是一个示例文件:

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解决方案),或将文件视为二进制( …

file-io r

19
推荐指数
5
解决办法
3038
查看次数

和遗传有什么区别?

如果我想检查变量是否继承自某个类,我可以使用isinherits.

class(letters)
## [1] "character"
is(letters, "character")
## [1] TRUE
inherits(letters, "character")
## [1] TRUE
Run Code Online (Sandbox Code Playgroud)

我是否应该选择使用哪一种,并且它们是否会返回不同的值?

inheritance r r-faq

19
推荐指数
1
解决办法
5991
查看次数

使用roxygen2 v4导出名称中带点的非S3方法

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作为兼容性的弃用函数保留.)

r roxygen2

18
推荐指数
1
解决办法
1028
查看次数