2015-02-05 22 views
0

分配的R帮助表示:“分配不派遣分配方法,因此它不能用于设置向量元素,名称,属性等。”低了下去,在例子中,我们显示:如何使用assign来修改R中的矢量的一部分?

a <- 1:4 
assign("a[1]", 2) 
a[1] == 2   # FALSE 
get("a[1]") == 2 # TRUE 

我想知道如何解决这个问题,这个例子所指出的 - 给代表一个向量或数据帧的一部分字符串,我怎么能分配到该位置?我可以获取值:

x <- "a[1]" 
eval(parse(text=x)) # 1 

,当然我可以分配到一个载体

a[1:2] <- c(0,0) 

这样的一部分我怎么把这些结合在一起,如果我开始与字符串?


谢谢LauriK,但我的困难是字符串是“a [1:2]”,所以即使get也会失败。我会解释让我问这个问题的理由。

我有两个数据帧,一个是这样的:

> df 
    Fiscal Year Num Deferrals 1 Yr Prob 
1  2015    0  100% 
2  2016    0  100% 
3  2017   65   98% 
2 Year Total    65   n/a 
2 Year Average   32   n/a 

,另一个是这样的:

> sv 
nDeferrals nSmallDeferrals oneYrProb 
      0     0  1.0000 
      0     0  1.0000 
     65    63  .9797 

我要救这两个东西部分的描述,并且在未来的运行,只要第一个没有改变,我会用第二个的值代替它。所以,我有两个字符串:

"df$'1 Yr Prob'[1:3]" 
"sv$oneYrProb" 

只要“DF $'1年习题[1:3]”不改变,我会用‘SV $ oneYrProb’无论价值覆盖它是在未来的运行时间。我节省两个变量的名称,并在当时的第一个它被冻结的价值:

freeze <- function(R_name, saved_name) { 
    frozen <- new.env() 
    R_value <- eval(parse(text=R_name)) 
    with(frozen, assign(R_name, list(R_name, R_value, saved_name))) 
    save(frozen, file="frozen.RData") 
} 

的结果是“冻结”环境包含看起来像这样的变量:

> frozen$"df$'1 Yr Prob'[1:3]" 
[[1]] 
[1] "df$\"1 Yr Prob\"[1:3]" 

[[2]] 
[1] "100% "100%" "98%" 

[[3]] 
[1] "sv$oneYrProb" 

所以我有字符串代表测试中的两个对象,以及第一个被冻结时的值。 。
我能得到对象的值 - 使用“的eval(解析” - ,但我不知道该怎么存回第一个我有:

processFreezeList <- function() { 
    load("frozen.RData", envir=.GlobalEnv) 
    variables <- ls(frozen) 
    for (v in variables) { 
     temp <- get(v, frozen) 
     R_name <- temp[[1]] 
     R_value <- temp[[2]] 
     saved_name <- temp[[3]] 
     if (all(eval(parse(text=R_name)) == R_value)) 
      assign(R_name, eval(parse(text=saved_name)), envir=.GlobalEnv) 
    } 
} 

写在第一相反的对象的分配创建了一个新的变量:

"df$/"1 Yr Prob/"[1:3]" 

以该字符串,我可以把它拿来代表的价值观,但我不知道如何对它们写回为了解决我将目光转向了原来的问题。替代品,但它似乎确实应该可以用字符串做到。

+5

为什么你认为你需要这样做?你可能不会。如果你使用'eval()'或'assign()',那么几乎总是有一种“更好”,更“类似R”的方式来做事情。 – MrFlick

回答

0

我有一个问题的答案激发了我的问题,我认为它可以推广。它看起来像这样:

a <- c(1,1,1) 
b <- c(2,2,2) 
x <- "a[1]" 
y <- "b[1]" 
eval(parse(text=paste(x,"<-",y) 
a 
[1] 2 1 1 

换句话说,将赋值本身放到字符串中并将其评估。

+1

@RichardScriven我想感谢LauriK和RichardScriven帮助我解决这个问题。 – user3517677

1

如果我正确理解你,那么你只需要知道向量名称作为字符串变量就可以改变向量的部分。尝试这样的:

> (a <- letters[1:5]) 
[1] "a" "b" "c" "d" "e" 
> x <- "a" 
> var.x <- get(x) 
> var.x[1:2] <- c(0,0) 
> assign(x, var.x) 
> a 
[1] "0" "0" "c" "d" "e" 
+0

@RichardScriven请解释一下。我将第一行添加到我的答案中,它可以解答原始问题。现在我已经看到了大量编辑的原始问题,我会在几个小时内看看它,看看我能否提出更好的答案。 – LauriK

+1

那么你原来的答案触发'get(x)'中的错误,因为'a'没有被定义。并因此在每次通话中触发错误。 –

+0

@LauriK我还在这里。我的字符串不像“a”。它是“a [1]”的许多变体之一,get(“a [1]”)不起作用。 – user3517677