小编Rap*_*ter的帖子

根据具有特定顺序的向量对数据帧行进行排序

有没有更简单的方法来确保数据框的行按照我在下面的简短示例中实现的"目标"向量进行排序?

df <- data.frame(name = letters[1:4], value = c(rep(TRUE, 2), rep(FALSE, 2)))

df
#   name value
# 1    a  TRUE
# 2    b  TRUE
# 3    c FALSE
# 4    d FALSE

target <- c("b", "c", "a", "d")
Run Code Online (Sandbox Code Playgroud)

为了完成工作,这似乎有点太"复杂"了:

idx <- sapply(target, function(x) {
    which(df$name == x)
})
df <- df[idx,]
rownames(df) <- NULL

df 
#   name value
# 1    b  TRUE
# 2    c FALSE
# 3    a  TRUE
# 4    d FALSE
Run Code Online (Sandbox Code Playgroud)

sorting r dataframe

141
推荐指数
4
解决办法
11万
查看次数

扩展某个其他包的S4方法时,Rd文件名冲突

实际问题

如何避免Rd文件名冲突

  1. 一个S4通用及其方法(或多个)不必然全部在相同的包中定义(含有(部分的)自定义方法(一个或多个)软件包依赖于包含所述通用包)和
  2. 使用roxygenize()包roxygen2生成实际的Rd文件?

roxygen2当通用及其方法分散在各个包中时,我不确定这是一个问题还是一个常见问题(如果遵循模块化编程风格,恕我直言肯定是一个真实的用例场景).

处理这些情况的推荐方法是什么?

插图

在包中 pkga

假设在包中pkga你定义了一个通用方法foo,并且你已经提供了相应的roxygen代码来roxygenize()获取生成Rd文件:

#' Test function
#' 
#' Test function.
#' 
#' @param ... Further arguments.
#' @author Janko Thyson \email{janko.thyson@@rappster.de}
#' @example inst/examples/foo.R
#' @docType methods
#' @rdname foo-methods
#' @export

setGeneric(
    name="foo",
    signature=c("x"),
    def=function(
         x,  
        ...
    ) {
    standardGeneric("xFoo")       
    }
)
Run Code Online (Sandbox Code Playgroud)

当roxygenizing()您的包时,foo-methods.Rd在man子目录中创建一个调用的文件,该子目录充当可能为此泛型方法创建的所有方法的引用Rd文件.到现在为止还挺好.如果这个通用的所有方法也是你的包的一部分,一切都很好.例如,这个roxygen代码将确保foo-methods.Rd为以下ANY方法添加文档foo:

#' @param x …
Run Code Online (Sandbox Code Playgroud)

generics r package s4 roxygen2

58
推荐指数
1
解决办法
2130
查看次数

在R中实现标准软件设计模式(专注于MVC)

目前,我正在阅读很多关于软件工程,软件设计,设计模式等的内容.来自完全不同的背景,这对我来说都是新的迷人的东西,所以如果我没有使用正确的技术术语,请耐心等待我描述某些方面;-)

我最终在大部分时间都使用了引用类(R中的OOP方法),因为面向对象似乎是我正在做的很多东西的正确选择.

现在,我想知道是否有人在R中实现MVC(模型视图控制器;也称为MVP:模型视图展示器)模式方面有一些好的建议或经验,最好使用参考类.

我也对其他"标准"设计模式(如观察者,黑板等)的信息非常感兴趣,但我不想让这个问题过于宽泛.我想最酷的事情是看到一些最小的示例代码,但任何指针,"架构",图表或任何其他想法也将非常感谢!

对于那些对类似内容感兴趣的人,我真的可以推荐以下书籍:

  1. 务实的程序员
  2. 设计模式

更新2012-03-12

我最终想出了一个我对MVC的解释的一个小例子(可能不完全正确;-)).

包依赖性

require("digest")
Run Code Online (Sandbox Code Playgroud)

类定义观察者

setRefClass(
    "Observer",
    fields=list(
        .X="environment"
    ),
    methods=list(
        notify=function(uid, ...) {
            message(paste("Notifying subscribers of model uid: ", uid, sep=""))
            temp <- get(uid, .self$.X)
            if (length(temp$subscribers)) {
                # Call method updateView() for each subscriber reference
                sapply(temp$subscribers, function(x) {
                    x$updateView()        
                })
            }    
            return(TRUE)
        }
    )
)
Run Code Online (Sandbox Code Playgroud)

类定义模型

setRefClass(
    "Model",
    fields=list(
        .X="data.frame",
        state="character",
        uid="character",
        observer="Observer"
    ),
    methods=list(
        initialize=function(...) {
            # Make sure all …
Run Code Online (Sandbox Code Playgroud)

design-patterns r pass-by-reference reference-class

56
推荐指数
1
解决办法
2768
查看次数

向R核心团队提出功能请求

为了提出功能请求,联系R核心团队的推荐方式/工作流程是什么?

通过"功能请求",我不仅仅意味着发出类似"我希望看到功能XY执行XY的东西,所以如果你继续为我实现这个功能会很酷",而是提出实际的代码.

我喜欢R,我愿意贡献,分享代码和所有.然而,有时我发现有点难以弄清楚究竟如何贡献;-)我看了R Project Developer Page并且多次使用r-devel邮件列表.特别是对于后者,我得到的印象是,它不是正确的地方/不希望用实际代码详细说明一个人的功能请求(有时可能不仅仅是两个班轮).所以我想知道是否有一种"更好"或更"系统"的方式来做到这一点.

编辑2011-11-09

我被要求提供一个简短的例子:

我正在广泛使用S4 Reference Classes并为我的对象实现了许多小实用程序功能.一个这样的效用函数是某种"重置"功能:

setRefClass(
    "A", 
    fields=list(a="numeric", b="character"),
    methods=list(
        reset=function(fields=NULL, ...){
            temp <- new("A")
            if(is.null(fields)){
                fields <- names(getRefClass("A")$fields())
            }
            sapply(fields, function(x){
                .self$field(name=x, value=temp$field(x))        
            })
            return(TRUE)
        }
    )
)

x <- new("A", a=1:10, b=letters[1:10])

x$a
x$b
x$reset(fields="a")

x$a
x$b

x$reset()
x$a
x$b
Run Code Online (Sandbox Code Playgroud)

很多时候,这不是世界上最精彩的功能,突然出现在我的"哦,那个缺失"列表中.此外,它可能是一种"单一"功能,开发整个包装有时感觉就像用大锤敲打坚果.

open-source r

49
推荐指数
4
解决办法
1418
查看次数

编写健壮的R代码:命名空间,屏蔽和使用`::`运算符

精简版

对于那些不想阅读我的"案例"的人来说,这就是本质:

  1. 什么是最小化新包破坏现有代码的可能性的推荐方法,即使您编写的代码尽可能健壮?
  2. 什么是在何时充分利用命名空间机制的推荐方法

    a)只使用贡献包(比如在一些R分析项目中)?

    b)关于开发自己的包裹?

  3. 如何最好地避免与正式类(在我的情况下主要是引用类)之间的冲突,因为甚至没有与::类(AFAIU)相当的命名空间机制?


R宇宙的运作方式

这件事情在我脑海中唠叨了大约两年了,但我觉得我没有达到令人满意的解决方案.另外我觉得情况越来越糟.

我们看到CRAN,github,R-Forge等上的包装数量越来越多,这简直太棒了.

在这样一个分散的环境中,组成R的代码库(简单来说就是基础R和贡献R,为简单起见)自然会偏离理想状态而不是鲁棒性:人们遵循不同的约定,有S3,S4如果存在强制执行约定的" 中央清算实例 ",那么事情就不会像它们那样"一致" .没关系.

问题

鉴于上述情况,使用R编写健壮的代码可能非常困难.并非您需要的所有东西都在基础R中.对于某些项目,您最终会加载相当多的贡献包.

恕我直言,这方面最大的问题是命名空间概念在R中使用的方式:R允许简单地写出某个函数/方法的名称而不明确要求它的命名空间(即foovs. namespace::foo).

所以为了简单起见,这就是每个人都在做的事情.但是这样,名称冲突,破坏代码以及重写/重构代码的需要只是时间问题(或者加载的不同包的数量).

充其量,您将了解新添加的包掩盖/重载哪些现有功能.在最坏的情况下,在您的代码中断之前,您将毫无头绪.

几个例子:

(我不记得哪些功能特别导致了这些问题,但如果有兴趣,我愿意再次查询)

令人惊讶的是,这似乎并没有困扰很多程序员.我试图在r-devel上多次提高兴趣,但没有显着的效果.

使用::运营商的缺点

  1. ::Dominick Samperi 指出,使用操作员可能会在某些情况下严重影响效率.
  2. 在开发 …

coding-style namespaces r package masking

45
推荐指数
2
解决办法
3451
查看次数

使用基本R功能舍入POSIX日期(POSIXct)

我正在玩很多关于我正在建造的包裹的日期和时间.

在这篇文章中磕磕绊绊地再次提醒我,在转向contrib包之前,查看是否可以使用基本R功能完成某些操作通常并不是一个坏主意.

因此,是否可以POSIXct使用基本R功能来舍入课程日期?

我检查了

methods(round)
Run Code Online (Sandbox Code Playgroud)

"只"给了我

[1] round.Date      round.timeDate*

   Non-visible functions are asterisked
Run Code Online (Sandbox Code Playgroud)

这是我想做的(伪代码)

x <- as.POSIXct(Sys.time())
[1] "2012-07-04 10:33:55 CEST"

round(x, atom="minute")
[1] "2012-07-04 10:34:00 CEST"

round(x, atom="hour")
[1] "2012-07-04 11:00:00 CEST"

round(x, atom="day")
[1] "2012-07-04 CEST"
Run Code Online (Sandbox Code Playgroud)

我知道这可以用timeDate,lubridate等来完成,但是我想保持包依赖性.所以在继续检查相应软件包的源代码之前,我想我会问有人已经做过这样的事情了.

datetime r date rounding posixct

31
推荐指数
2
解决办法
2万
查看次数

正确使用devtools和/或RStudio相对于.Rbuildignore

通过以下方式构建R包时,我想排除以下资源.Rbuildignore:

^.*\.Rproj$
^\.Rproj\.user$
inst/examples
inst/prof
man-roxygen
tests
Run Code Online (Sandbox Code Playgroud)

但我很困惑,因为它似乎有时似乎有效,有时它却没有.

我猜测它必须要做我是否正在使用devtools::build(),devtools::install()或者在RStudio中击中SHFT + CTRL + B(或构建>>构建和重新加载)时发生的任何事情.

我能找到的唯一相关资源是这篇文章导致了这个问题,但我仍然没有完全理解.

这是我试过的:

  1. 通过RStudio快捷方式加载所有后跟Build和Reload:

    这是我在打电话时看到的list.files(file.path(R.home("library"), "mypackage")):

    [1] "DESCRIPTION" "examples"    "help"        "html"       
    [5] "INDEX"       "Meta"        "NAMESPACE"   "prof"       
    [9] "R"      
    
    Run Code Online (Sandbox Code Playgroud)
  2. 加载所有后跟Build和Reload,然后按devtools::install():

    这是我在打电话时看到的list.files(file.path(R.home("library"), "mypackage")):

     [1] "DESCRIPTION" "examples"    "help"        "html"       
     [5] "INDEX"       "Meta"        "NAMESPACE"   "prof"       
     [9] "R"           "tests"      
    
    Run Code Online (Sandbox Code Playgroud)
  3. devtools::load_all()其次是devtools::build()其次devtools::install():

    这是我在打电话时看到的 …

ignore r build devtools rstudio

25
推荐指数
1
解决办法
952
查看次数

有没有办法为S4 Reference Classes声明公共和私有方法?

先期:我很清楚,R是一个功能性的语言,所以请不要咬;-)

我在很多程序中使用OOP方法都有很棒的经验.现在,我想知道在R中使用S4参考类时是否有办法区分公共方法和私有方法?

例

类定义

setRefClass("B",
    field=list(
        b.1="numeric",
        b.2="logical"
    ),
    methods=list(
        thisIsPublic=function(...) {
            thisIsPublic_ref(.self=.self, ...)
        },
        thisIsPrivate=function(...) {
            thisIsPrivate_ref(.self=.self, ...)
        }
    )
)

setRefClass("A",
    field=list(
        a.1="B"
    )
)
Run Code Online (Sandbox Code Playgroud)

注意

我通常不会将实际的方法定义放在类def中,而是将其分离为S4方法(即thisIsPublic_ref),原因如下:

  1. 这样,在单个方法defs变得非常大的情况下,类def保持清晰排列并且更容易阅读.
  2. 它允许您随时切换到方法的功能执行.作为x某个类的实例,您可以调用foo_ref(.self=x)而不是x$foo().
  3. compiler::cmpfun()如果你有"普通"的引用类方法,它允许你对我认为不可能的方法进行字节编译.

对于这个具体的例子来说,确实没那么复杂是有道理的,但我想我会说明这种方法.

方法定义

setGeneric(
    name="thisIsPublic_ref",
    signature=c(".self"),
    def=function(
        .self,
        ...
    ) {
    standardGeneric("thisIsPublic_ref")    
    }
)
setGeneric(
    name="thisIsPrivate_ref",
    signature=c(".self"),
    def=function(
        .self,
        ...
    ) {
    standardGeneric("thisIsPrivate_ref")    
    } …
Run Code Online (Sandbox Code Playgroud)

oop encapsulation r private-methods public-method

23
推荐指数
2
解决办法
5322
查看次数

多次使用位置`$`运算符来更新嵌套数组

这个问题是密切相关的这一个,我会考虑在NoSQL的情况下给出关于架构设计的意见,但我很好奇,想明白这一点:

实际问题

假设您有以下文档:

    _id : 2      abcd
    name : 2     unittest.com
    paths : 4    
        0 : 3    
            path : 2     home
            queries : 4      
                0 : 3    
                    name : 2     query1
                    url : 2      www.unittest.com/home?query1
                    requests: 4

                1 : 3    
                    name : 2     query2
                    url : 2      www.unittest.com/home?query2
                    requests: 4
Run Code Online (Sandbox Code Playgroud)

基本上,我想知道

  1. 如果可以在涉及"嵌套度"大于1的数组/文档结构的更新方案中多次使用MongoDB的位置$运算符(详细信息),或者换句话说不同:

    { <update operator>: { "paths.$.queries.$.requests" : value } }(不起作用)

    而不是"只"能够使用$ 一次顶级数组并绑定为"更高级别"上的数组使用显式索引:

    { <update operator>: { "paths.$.queries.0.requests" : …

r mongodb nosql rmongodb

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

非闪亮上下文中的反应对象绑定

实际问题

你怎么能接近由闪亮函数建立的反应环境/行为,或者甚至可能在非闪亮的上下文中使用这些函数来创建"反应"变量?

背景

我对闪亮的框架及其底层范例非常着迷.特别是关于已建立的整体反应环境.只是为了它的纯粹乐趣,我想知道是否可以将这种反应式编程范式转换为非闪亮的上下文 - 即常规的R应用程序/项目/包或者你想要调用它.

也许思考选项:您可能希望option_2依赖于值option_1来确保一致的数据状态.如果option_1改变,也option_2应该改变.

我想我正在寻找尽可能高效的东西,即option_2应该只在必要时更新,即option_1实际更改时(与计算option_2 每次查询选项的当前状态相反).

尽职调查

我用以下功能玩了一下:

  • shiny::reactiveValues
  • shiny::reactive
  • shiny::observe
  • shiny::isolate

但是AFAIU,当然,它们与闪亮的环境紧密相关.

自己的原型

这是一个基于environments 的非常简单的解决方案.它有效,但是

  1. 我会对不同/更好的方法感兴趣
  2. 我想也许有人可能会以某种方式重复使用闪亮的代码.

set功能定义:

setValue <- function(
  id,
  value,
  envir,
  observe = NULL,
  binding = NULL,
  ...
) {

  ## Auxiliary environments //
  if (!exists(".bindings", envir, inherits = FALSE)) { …
Run Code Online (Sandbox Code Playgroud)

r reactive-programming shiny

19
推荐指数
2
解决办法
1315
查看次数