如何使用 assign 修改 R 中向量的一部分?
How to use assign to modify part of a vector in R?
分配的R帮助说:"assign does not dispatch assignment methods, so it cannot be used to set elements of vectors, names, attributes, etc."往下看,在例子中,我们显示:
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]",所以即使获取也会失败。我将解释让我问这个问题的原因。
我有两个数据框,一个像这样:
> 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
我想保存这两个东西的部分描述,在以后的运行s中,只要第一个不变,我就会用第二个的值替换它。所以我有两个字符串:
"df$'1 Yr Prob'[1:3]"
"sv$oneYrProb"
只要"df$'1 Yr Prob[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" 环境包含如下所示的变量:
> 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(parse" -,但我不知道如何存储回第一个对象。我有:
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]"
有了那个字符串,我可以获取它代表的值,但我不知道如何写回它们。为了解决原来的问题,我转向替代,但它似乎应该可以用字符串来解决。
如果我理解正确,那么您想更改向量的一部分,同时只知道向量名称作为字符串变量。尝试这样的事情:
> (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"
我对激发我的问题的问题有一个答案,我认为它可以推广。它看起来像这样:
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
换句话说,将赋值本身带入字符串并对其求值。
分配的R帮助说:"assign does not dispatch assignment methods, so it cannot be used to set elements of vectors, names, attributes, etc."往下看,在例子中,我们显示:
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]",所以即使获取也会失败。我将解释让我问这个问题的原因。
我有两个数据框,一个像这样:
> 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
我想保存这两个东西的部分描述,在以后的运行s中,只要第一个不变,我就会用第二个的值替换它。所以我有两个字符串:
"df$'1 Yr Prob'[1:3]"
"sv$oneYrProb"
只要"df$'1 Yr Prob[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" 环境包含如下所示的变量:
> 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(parse" -,但我不知道如何存储回第一个对象。我有:
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]"
有了那个字符串,我可以获取它代表的值,但我不知道如何写回它们。为了解决原来的问题,我转向替代,但它似乎应该可以用字符串来解决。
如果我理解正确,那么您想更改向量的一部分,同时只知道向量名称作为字符串变量。尝试这样的事情:
> (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"
我对激发我的问题的问题有一个答案,我认为它可以推广。它看起来像这样:
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
换句话说,将赋值本身带入字符串并对其求值。