2015-02-05 25 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