R语言列表中的函数

时间:2014-08-10 00:12:59

标签: r list object

G'Day,我是R的新手,我有GOOGLED和阅读书籍,并且有很多游戏,但我似乎无法弄清楚我正在做的事情是否已实施。它编译(没有解释器吐)并且可以调用(再次没有吐),它似乎似乎不想做任何事情。

行。概要

我读到R中的列表是其他语言的对象。所以,只是为了周六和周日的比赛,我一直试图让它发挥作用。

GLOBAL <- list( counter = 1,
                locked = FALSE,
                important_value = 42,
                copy_of_important_value = 42,
                lock = function() { GLOBAL$locked = TRUE },
                unlock = function() { GLOBAL$locked = FALSE },
                is_locked = function() { return(GLOBAL$locked )},
                visit = function() { GLOBAL$counter <- GLOBAL$counter + 1 })

> GLOBAL$locked
[1] FALSE
> 

这有效......

> GLOBAL$locked <- TRUE
> GLOBAL$locked
[1] TRUE
> 

这不是

> GLOBAL$unlock()
> GLOBAL$locked
[1] TRUE
>

R得到$ this或$ self构造?这些都不会产生任何错误。只是似乎不想做任何事情! (功能)。我想我可以设置一个函数作为路由访问表,但我认为封装会很漂亮。

第二个问题。我已多次提到R必须将所有数据保存在内存中,这是一个限制。这包括* NIX系统上的swp吗?我的意思是,如果你有一个humungus矩阵,你可以添加一些交换来使它适合吗?

抱歉愚蠢的新手问题

4 个答案:

答案 0 :(得分:6)

这可以使用proto对象完成:

library(proto) # home page at http://r-proto.googlecode.com

GLOBAL <- proto( counter = 1,
                 locked = FALSE,
                 important_value = 42,
                 copy_of_important_value = 42,
                 lock = function(.) { .$locked = TRUE },
                 unlock = function(.) { .$locked = FALSE },
                 is_locked = function(.) { return(.$locked )},
                 visit = function(.) { .$counter <- .$counter + 1 })

GLOBAL$locked <- TRUE
GLOBAL$unlock() 
GLOBAL$locked
## FALSE

答案 1 :(得分:2)

S3的做事方式。

GLOBAL <- list(counter=1, locked=FALSE,
    important_value=42, copy_of_important_value=42)

class(GLOBAL) <- "foo"

lock <- function(x, ...) UseMethod("lock")
lock.foo <- function(x)
{
    x$locked <- TRUE
    x
}

unlock <- function(x, ...) UseMethod("unlock")
unlock.foo <- function(x)
{
    x$locked <- FALSE
    x
}

is_locked <- function(x) x$locked

visit <- function(x)
{
    x$counter <- x$counter + 1
    x
}


GLOBAL <- lock(GLOBAL)   # locked is now TRUE
GLOBAL <- unlock(GLOBAL) # locked is now FALSE

答案 2 :(得分:2)

还有封闭方法

getGlobal <- function() {
    counter <- 1
    locked <- FALSE
    important_value <- 42
    list(
        is_locked = function() locked,
        lock = function() locked<<-TRUE,
        unlock = function() locked<<-FALSE,
        visit = function() {counter <<- counter + 1 }
    )
}

然后你会用

GLOBAL <- getGlobal()

GLOBAL$is_locked()    
# [1] FALSE
GLOBAL$lock()
GLOBAL$is_locked()    
# [1] TRUE

因此状态存储在机箱中,getGlobal返回一个函数列表,您可以使用这些函数来访问那些未以其他方式暴露的变量。

答案 3 :(得分:0)

没有发生任何事,因为

  • R没有任何变量可以获取,因为他们拥有它,=并不意味着在list()内发生了分配。因此,全球环境中唯一的对象是GLOBAL。您现在使用=的方式是将列表名称分配到左侧,然后使用$运算符访问它们。

  • 您的函数没有返回值,因为它们已被写入。 GLOBAL$locked()如果在调用它的函数体内只有GLOBAL$locked <- FALSE,则locked不会返回值。所以我将它包装在括号中,并返回我们的愿望值。

因此,我们需要首先将<<-分配给全局环境,然后> GLOBAL <- list(locked = assign("locked", FALSE, parent.frame()), lock = function() { (GLOBAL$locked <<- TRUE) }, unlock = function() { (GLOBAL$locked <<- 'HELLO') }, is_locked = function() { return(NULL) }) > GLOBAL$locked [1] FALSE > GLOBAL$lock() [1] TRUE > GLOBAL$unlock() [1] "HELLO" > GLOBAL$is_locked() NULL 将重新分配它。

我稍微缩短了你的名单。这看一下:

> l <- list(x = 5, y = 10)
> within(l, {
      f <- function(x) 2 * x
  })
$x
[1] 5

$y
[1] 10

$f
function (x) 
2 * x
<environment: 0xb041278>

是的,列表有自己的环境,与全局环境分开。一个例子是

> environment()
<environment: R_GlobalEnv>

但我们目前处于全球环境

{{1}}

有趣的是你应该问这个问题,因为我昨天刚刚问过a question about the same thing。 MrFlick对这个问题提供了非常好的解释。