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矩阵,你可以添加一些交换来使它适合吗?
抱歉愚蠢的新手问题
答案 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对这个问题提供了非常好的解释。