小编Rap*_*ter的帖子

迭代解析XML文件时严重的内存泄漏

上下文

当迭代一组Rdata文件(每个包含HTML代码的字符向量),这些文件被加载,分析(通过XML功能),然后再次从内存中删除,我体验到R进程的内存消耗显着增加(杀死了过程最终).

它似乎就像

  • 释放物体free(),
  • 通过rm()和删除它们
  • 赛跑 gc()

没有任何影响,所以内存消耗累积,直到没有更多的内存.

编辑2012-02-13 23:30:00

感谢包XML的作者和维护者共享的宝贵见解,Duncan Temple Lang(再次:我非常感谢!),问题似乎与释放外部指针的方式以及如何处理垃圾收集密切相关XML包.Duncan发布了一个错误修复版本的软件包(3.92-0),它整合了解析XML和HTML的某些方面,并具有改进的垃圾收集功能,不再需要显式释放包含外部指针的对象free().您可以在Duncan的Omegahat网站上找到源代码和Windows二进制文件.


编辑2012-02-13 23:34:00

不幸的是,新的软件包版本似乎仍然没有解决我在我放在一起的小小例子中遇到的问题.我遵循了一些建议并稍微简化了示例,使得更容易掌握并找到事情似乎出错的相关功能(检查功能./lib/exampleRun.R和.lib/scrape.R).


编辑2012-02-14 15:00:00

Duncan建议尝试强制通过显式释放已解析的文档.Call("RS_XML_forceFreeDoc", html).我在示例中(do.forcefree在脚本中./scripts/memory.R)包含了一个逻辑开关,如果设置为TRUE,则会执行此操作.不幸的是,这让我的R控制台崩溃了.如果有人可以在他们的机器上验证这一点,那就太棒了!实际上,在使用最新版本的XML时,应该自动释放doc (参见上文).事实上它似乎不是一个错误(根据Duncan).


编辑2012-02-14 23:12:00

Duncan将另一个版本的XML(3.92-1)推送到他的Omegahat网站Omegahat网站.这应该解决一般问题.但是,我似乎对我的例子运气不好,因为我仍然遇到相同的内存泄漏.


编辑2012-02-17 20:39:00>解决方案!

是!邓肯发现并修复了这个错误!在一个仅限Windows的脚本中,这是一个小错字,它解释了为什么这个bug没有在Linux,Mac OS等中显示.请查看最新版本3.92-2.!现在,内存消耗与迭代解析和处理XML文件时一样不变!

特别感谢Duncan Temple Lang,感谢响应这个问题的所有人!


>>>原始问题的遗留部分<<<

示例说明(编辑2012-02-14 15:00:00)

  1. 从我的Github仓库下载文件夹'memory'.
  2. 打通脚本./scripts/memory.R和设置)的工作目录在第6行,b)将实施例范围,在 …

xml memory-leaks r bigdata web-scraping

14
推荐指数
1
解决办法
2884
查看次数

高级错误处理

我最近提出了这个问题,幸好有人指出withRestarts()这对我来说看起来非常棒和强大:-)现在我渴望更详细地了解R的错误处理能力.

实际问题

  1. 推荐的用途是simpleCondition()什么?从来没有使用它,但我认为它可能有助于设计实际上是"真实"条件的自定义错误和警告.它可以用于构建特定条件的数据库,具体的处理程序可用吗?
  2. 有没有办法"冻结" 整个 R工作区的某个状态并返回它以在某个点重新开始计算?我知道save.image(),但AFAIU,这不存储搜索路径(search()或searchpaths())的"状态" .

对于那些感兴趣

两个代码示例

  1. 我目前使用的插图withRestarts依赖于这篇博文
  2. 试图定义"自定义条件"

我很感激有关做什么更好的任何意见/建议;-)

例1

require("forecast")
autoArimaFailsafe <- function(
    x,
    warning=function(w, ...) {
        message("autoArimaFailsafe> warning:")
        message(w)
        invokeRestart("donothing")},
    error=function(e, ...) {
        message("autoArimaFailsafe> error:")
        message(e)
        invokeRestart("abort")}
) {
    withRestarts(
        out <- tryCatch(
           {
                expr <- expression(auto.arima(x=x))
                return(eval(expr))
           },
           warning=warning,
           error=error 
        ),
        donothing=function(...) {
            return(eval(expr))
        },
        abort=function(...) {
            message("aborting")
            return(NULL)
        }
    )    
}
data(AirPassengers)
autoArimaFailsafe(x=AirPassengers)
autoArimaFailsafe(x="a")
Run Code Online (Sandbox Code Playgroud)

例2

require("forecast")
autoArimaFailsafe <- …
Run Code Online (Sandbox Code Playgroud)

error-handling r conditional-statements application-restart

14
推荐指数
1
解决办法
1851
查看次数

直接从R代码创建UML图

有没有人对如何直接从R代码创建UML图有实际的方法?

这几乎是我在这方面找到的唯一资源.工作,但不是真正"集成"的意义,即在任何类型的实际代码中自动检测图表所需的信息.

与此问题相关.

uml r

14
推荐指数
1
解决办法
1845
查看次数

识别数据框A中未包含的数据框中的记录

这是我第一次在这里发帖,所以请善待;-)

编辑 在我有机会向我建议更改之前,我的问题已经关闭.所以我现在正努力做得更好,感谢所有回答到目前为止的人!

题

我怎样才能识别数据帧记录/行x.1那些未包含在数据帧x.2基于所有的可用属性(即所有列)最有效的方法是什么?

示例数据

> x.1 <- data.frame(a=c(1,2,3,4,5), b=c(1,2,3,4,5))
> x.1
  a b
1 1 1
2 2 2
3 3 3
4 4 4
5 5 5

> x.2 <- data.frame(a=c(1,1,2,3,4), b=c(1,1,99,3,4))
> x.2
  a  b
1 1  1
2 1  1
3 2 99
4 3  3
5 4  4
Run Code Online (Sandbox Code Playgroud)

期望的结果

  a b
2 2 2
5 5 5
Run Code Online (Sandbox Code Playgroud)

最好的解决方案

由Brian Ripley教授和Gabor Grothendieck教授完成

> fun.12 <- …
Run Code Online (Sandbox Code Playgroud)

merge join r match dataframe

13
推荐指数
1
解决办法
4129
查看次数

链接到闪亮应用程序的选项卡或面板

如何设置从给定的闪亮部件链接到位于其他选项卡/面板上的部件?

更新

我在下面草拟的解决方案适用于链接到标签/面板的明确情况(这就是我要求的).

但是,我也有兴趣了解更多通用方法来链接闪亮应用程序的各个部分.

例

我想从面板A链接到面板B,但是当我点击面板A中的操作链接时,我不太清楚我需要指定什么作为动作.

价值#tab-4527-2来自调查HTML输出ui,但我刚看到每次重新启动应用程序时这些值都会改变.

library(shiny)

# UI ---------------------------------------------------------------------

ui <- fluidPage(
  tabsetPanel(
    tabPanel(
      "A",
      p(),
      actionLink("link_to_tabpanel_b", "Link to panel B")
    ),
    tabPanel(
      "B",
      h3("Some information"),
      tags$li("Item 1"),
      tags$li("Item 2")
    )
  )
)

# Server ------------------------------------------------------------------

server <- function(input, output, session) {
  observeEvent(input$link_to_tabpanel_b, {
    tags$a(href = "#tab-4527-2")
  })
}

shinyApp(ui, server)
Run Code Online (Sandbox Code Playgroud)

html r href hyperlink shiny

13
推荐指数
4
解决办法
7524
查看次数

多行文本输入闪亮

我有哪些选择来实现带有多行/换行符的文本输入(显式的或只是用于UI中更好的输出的软包装)?

我想实现一个具有描述/详细信息字段的应用程序,输入的内容很可能不仅仅是一行.

基本上,我正在寻找一些东西来实现stackoverflow的文本输入框的类似功能我正在写这个问题:换行符,滚动条和/或(自动)调整高度.

例

# UI ---------------------------------------------------------------------

ui <- fluidPage(
  p(),
  textInput("title", "Title"),
  textInput("description", "Description"),
  tags$hr(),
  h3("Database state"),
  DT::dataTableOutput("datatable")
)

# Server ------------------------------------------------------------------

server <- function(input, output, session) {
  output$datatable <- DT::renderDataTable(
    data.frame(
      Title = input$title,
      Description = input$description,
      stringsAsFactors = FALSE
    )
  )
}

shinyApp(ui, server)
Run Code Online (Sandbox Code Playgroud)

user-interface r line-breaks shiny

12
推荐指数
1
解决办法
4710
查看次数

使用roxygen2:反斜杠处理示例文件是重复的(\ dontrun变为\\ dontrun)

实际问题

如何避免\dontrun{在包含示例的单独文件中\\dontrun{,在roxygenizing后在相应的Rd文件中?

我找到了一个解决方法,但感觉好像我可能只是错过了一些明显的东西,即一些设置roxigenize().

细节

我想我注意到一个可能的错误,或者,恕我直言,至少在处理使用roxygen2的示例时存在于一个单独的文件中的不良行为(而不是在实际的roxygen代码中说明它).

问题是,\dontrun{各个示例文件\\dontrun{中的行在roxygenizing后变为生成的Rd文件.

您可以在下面找到行为的说明以及简单的解决方法

1)确保目录

dir.create("src", recursive=TRUE, showWarnings=FALSE)
dir.create("package", recursive=TRUE, showWarnings=FALSE)

# Ensure empty package directory
subdirs <- list.files("package", full.names=TRUE)
if (length(subdirs)) {
    sapply(subdirs, unlink, recursive=TRUE)
}
Run Code Online (Sandbox Code Playgroud)

2)使用两种不同的嵌入示例的方式创建示例函数

foo1 <- function(x) {message("I'm foo #1"); return(TRUE)}
roxy.1 <- c(
    "#' Title foo1()",
    "#'", 
    "#' Description foo1().",
    "##' This line is commented out",
    "#'", 
    "#' @param x Some R object that …
Run Code Online (Sandbox Code Playgroud)

r roxygen roxygen2

11
推荐指数
1
解决办法
2010
查看次数

设置支持与客户端进行异步通信的R-Server

简而言之

是否可以设置一个可以异步方式处理/分派多个客户端请求的R-Server ?

我想我正在寻找某种套接字通信.或者让R与其他应用程序交谈更有效率吗?

现在,我真的不关心,如果通信是通过"纯香草socket通讯"(类似最终实现socketConnection(port=6011, server=TRUE)对服务器的过程中,socketConnection(host=Sys.info()["nodename"], port=6011)对于客户端进程(ES)结合writeLines()和readLines()JSON的字符字符串)或更多的东西"高级"喜欢使用基于HTTP请求的Web服务器设施.

更多细节

第一个:关于那些细节信息学细节的背景都是"DIY",所以套接字通信,主服务器概念或异步通信等细节对我来说都是新的.所以请不要咬;-)

我希望我的一个进程充当R-Server.AFAIU,R不是在"多线程范式"下设计的.所以我想知道如何让我的R-Server以异步方式处理并发客户端请求(当前来自通过JSON样式字符串发送其请求/对象的第三方软件).

用简单的英语我想告诉我的服务器进程是这样​​的:

在端口xy收到传入消息后,执行您需要执行的操作,但立即切换回"响应模式"以便能够处理下一个客户端请求,并始终注意每个客户端获取与其逻辑链接的结果各自的要求.

家庭作业

我从一些非常基本的东西开始:

con <- socketConnection(port=as.numeric(port), server=TRUE)
Run Code Online (Sandbox Code Playgroud)

这将使我的R进程成为服务器.它是一种享受,但由于它con是我的"唯一"连接对象,服务器注定要按顺序处理每个客户端请求:

从连接中读取输入,进行一些计算,将输出写回连接,然后才处理下一个客户端请求.

我想过让我的服务器进程立即将需要完成的所有事情分发给辅助Rscript进程,以便"主"服务器进程准备好接受下一个请求.但是,由于在一天结束时结果需要con再次通过(在我的"主"服务器进程中),我认为这并没有真正给我任何意义,因为服务器进程仍然需要等到辅助进程完成在接受下一个请求之前.或者,我可以告诉这个辅助过程"直接"以某种方式向客户请求报告吗?

虽然我目前的目标不是将我的服务器变成一个成熟的Web服务器,但这些复杂的Web服务器方法对我来说乍一看似乎非常有希望:

是否可以与其中一个进行异步客户端通信?

任何任何指针将大大赞赏!


编辑

一旦问题符合条件,我将提供300个积分的赏金.

sockets webserver client-server r

11
推荐指数
1
解决办法
2892
查看次数

推广`...`(三个点)参数dispatch:参数集的S4方法包括`...`

实际问题

是否可以为一组包含 ...(而不是专门用于...)的签名参数定义方法?这是不可能的"开箱即用",但理论上它是否可能(涉及一些调整)或者由于S4机制的设计方式,这是不能完成的事情?

我正在寻找一些类似的东西

setGeneric(
  name = "foo",
  signature = c("x", "..."),
  def = function(x, ...) standardGeneric("foo")      
)
setMethod(
  f = "foo", 
  signature = signature(x = "character", "..." = "ThreedotsRelevantForMe"), 
 definition = function(x, ...) bar(x = x)
)
Run Code Online (Sandbox Code Playgroud)

谢天谢地,马丁摩根指出了我dotsMethods,它说:

目前,"..."不能与其他形式参数混合:通用函数的签名只是"...",或者它不包含"......".(此限制可能会在将来的版本中解除.)

背景

考虑以下尝试来概括基于...简单情况的调度机制(只有一个函数应该使用传递的参数...;例如使用...in plot()来传递参数par())到涉及以下方面的场景(取自此处):

  • 当你想将参数传递给多个,因此r,接收者,
  • 当这些收件人可以位于c 调用堆栈的不同层上时
  • 当他们甚至可能使用相同的参数名称,但在他们自己的范围/闭包/框架/环境中将不同的含义与这些参数联系起来

另请注意,尽管这样做确实是一种好习惯,但 …

r argument-passing dispatch s4

11
推荐指数
1
解决办法
619
查看次数

R6类的多重继承

实际问题

有什么方法可以解决R6不支持多重继承的问题?

放弃

我知道R主要是一种功能语言.但是,它确实也有非常强大的面向对象的内置加:我看不出这有什么错模仿OOD原则/行为,当你

  1. 知道你是面向对象语言的原型,如C#,Java等.

  2. 您的应用程序原型需要自给自足("完整堆栈",包括DB后端,业务逻辑和前端/ UI)

  3. 你拥有像R6 这样伟大的 "原型技术"并且可以随意使用

上下文

我的用于Web应用程序的R原型需要"完全堆栈"/自给自足,并且尽可能接近我们的生产语言中使用的设计模式/原则和依赖注入容器(R中简单DI的概念证明)(C#/.净).

在这方面,我开始喜欢使用接口(或抽象类)来解耦代码模块并遵守OOD的SOLID原则的D(依赖性反转原则)(详见 "Uncle Bob") ).

尽管R6没有明确支持接口,但我仍然可以完全模仿它们,除了"抽象方法"之外什么都没有定义R6类(参见下面的例子).这有助于我将我的软件设计传达给我们不熟悉R的OO程序员.我努力为他们提供尽可能少的"概念转换努力".

但是,当我真正想从其他具体(而不是"类似抽象的"模仿接口类)继承时,我需要放弃我的inheritin R6Classfor 值,因为这将意味着定义不是一个但是两节课.inherit

例

在依赖倒置之前:

Foo取决于具体的课程Bar.从OOD原则来看,这非常糟糕,因为它导致代码紧密耦合.

Bar <- R6Class("Bar",
  public = list(doSomething = function(n) private$x[1:n]),
  private = list(x = letters)
) …
Run Code Online (Sandbox Code Playgroud)

oop r multiple-inheritance r6 dependency-inversion

11
推荐指数
2
解决办法
1539
查看次数