分配的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]"
以該字符串,我可以把它拿來代表的價值觀,但我不知道如何對它們寫回爲了解決我將目光轉向了原來的問題。替代品,但它似乎確實應該可以用字符串做到。
爲什麼你認爲你需要這樣做?你可能不會。如果你使用'eval()'或'assign()',那麼幾乎總是有一種「更好」,更「類似R」的方式來做事情。 – MrFlick