分配给空索引(空方括号x []

问题描述 投票:14回答:1

[在查看最近在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
r syntax casting variable-assignment reshape
1个回答
6
投票

这是有意记录的功能。如joran所述,文档页面“提取”将其包含在“原子向量”部分中:

空索引会选择所有值:最常用于替换所有条目但保留属性。

但是,在递归对象(例如data.frameslists)的情况下,仅为子集对象保留属性。它的零件没有得到这样的保护。

这里是一个例子:

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"

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

所以用空子集替换对于矢量,矩阵和数组非常安全,因为它们的元素不能具有自己的属性。但是在处理类似列表的对象时需要格外小心。

© www.soinside.com 2019 - 2024. All rights reserved.