简洁地同时分配名称和值

Ric*_*rta 6 r assign

我发现自己经常写下以下两行.有简洁的替代方案吗?

      newObj  <- vals
names(newObj) <- nams

# This works, but is ugly and not necessarily preferred
'names<-'(newObj <- vals, nams)
Run Code Online (Sandbox Code Playgroud)

我正在寻找类似的东西(当然这不起作用):

newObj <- c(nams = vals)
Run Code Online (Sandbox Code Playgroud)

将它包装在一个函数中也是一个选项,但我想知道功能是否已经存在.

样本数据

vals <- c(1, 2, 3)
nams <- c("A", "B", "C") 
Run Code Online (Sandbox Code Playgroud)

Das*_*son 14

你想要这个setNames功能

# Your example data
vals <- 1:3
names <- LETTERS[1:3]
# Using setNames
newObj <- setNames(vals, names)
newObj
#A B C 
#1 2 3 
Run Code Online (Sandbox Code Playgroud)


mne*_*nel 5

names<-方法通常(如果不总是)在内部复制对象.setNames只是一个包装names<-,

如果你想在代码和内存中简洁地分配名称和值,那么setattr来自bitdata.table包的函数将通过引用(不复制)执行此操作

例如

library(data.table) # or library(bit)
setattr(vals, 'names', names)
Run Code Online (Sandbox Code Playgroud)

也许稍微简洁一点,但你可以自己写一个简单的包装

name <- function(x, names){ setattr(x,'names', names)}


val <- 1:3
names <- LETTERS[1:3]
name(val, names)
# and it has worked!
val
## A B C 
## 1 2 3 
Run Code Online (Sandbox Code Playgroud)

请注意,如果您指定一个新对象,旧对象和新对象都将具有名称!