分配的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