R.S*_*.S. 13 syntax casting r variable-assignment reshape
在查看最近在SO上发布的答案时,我注意到了一个不熟悉的任务说明.而不是通常的形式 myVar<- myValue,它使用了myVar[]<- myValue.就个人而言,我从未见过这样的作业,但它有一个非常有用的效果 - 它将指定的数据myValue重新塑造为myVar的形状.
我想在我的代码中使用它.然而,文档"<-"似乎是沉默的.
这是一个完善的功能,可以依靠它在所有情况下工作吗?
另外,我的猜测是它可能是函数调用堆栈的副作用,即调用<-和[按顺序,但我无法弄清楚如何.有人可以对此有所了解吗?
这是一个例子 -
# A dataframe
df1<- data.frame(a=1:4, b=11:14)
# simple assignment assigns to class of RHS
df1<- c(21:24,31:34)
df1
#[1] 21 22 23 24 31 32 33 34
class(df1)
#[1] "integer"
#assignment with [] casts to class of LHS
df1<- data.frame(a=1:4, b=11:14)
df1[]<- c(21:24,31:34)
df1
# a b
# 1 21 31
# 2 22 32
# 3 23 33
# 4 24 34
# recycling to preserve shape
df1[]<- c(101:102)
df1
# a b
# 1 101 101
# 2 102 102
# 3 101 101
# 4 102 102
class(df1)
#data.frame
# reshaping
df1<- data.frame(a=1:4, b=11:14)
df1[] <- matrix(1:8, 2,4)
df1 #matrix reshaped
class(df1)
#[1] "data.frame"
# flattening
x<- 1:8
x[]<- matrix(1:8,4,2)
x
#[1] 1 2 3 4 5 6 7 8
Run Code Online (Sandbox Code Playgroud)
这是有意记录的功能。如joran所述,文档页面“提取”将其包含在“原子向量”部分中:
空索引会选择所有值:最常用于替换所有条目但保留属性。
然而,在递归对象(的情况下data.frames或lists,例如),属性将只被保留为子集化对象。它的零件没有得到这样的保护。
这是一个例子:
animals <- factor(c('cat', 'dog', 'fish'))
df_factor <- data.frame(x = animals)
rownames(df_factor) <- c('meow', 'bark', 'blub')
str(df_factor)
# 'data.frame': 3 obs. of 1 variable:
# $ x: Factor w/ 3 levels "cat","dog","fish": 1 2 3
df_factor[] <- 'cat'
str(df_factor)
# 'data.frame': 3 obs. of 1 variable:
# $ x: chr "cat" "cat" "cat"
rownames(df_factor)
# [1] "meow" "bark" "blub"
Run Code Online (Sandbox Code Playgroud)
df_factor保留其rownames属性,但该x列只是分配中使用的字符向量,而不是因素。我们可以x通过专门替换其值来保持其类别和级别:
df_factor <- data.frame(x = animals)
df_factor$x[] <- 'cat'
str(df_factor)
# 'data.frame': 3 obs. of 1 variable:
# $ x: Factor w/ 3 levels "cat","dog","fish": 1 1 1
Run Code Online (Sandbox Code Playgroud)
因此,用空子集替换对于矢量,矩阵和数组非常安全,因为它们的元素无法拥有自己的属性。但是在处理类似列表的对象时需要格外小心。