R使用赋值函数时将函数输出保存到对象

R Saving function output to object when using assign function

我目前正在尝试通过在函数的帮助下重写一些部分来使我的代码更加干燥。我正在使用的功能之一是:

datasetperuniversity<-function(university,year){assign(paste("data",university,sep=""),subset(get(paste("originaldata",year,sep="")),get(paste("allcollaboration",university,sep=""))==1))}

执行函数 datasetperuniversity("Harvard","2000") 会在函数内产生如下结果:

dataHarvard=subset(originaldata2000,allcollaborationHarvard==1)

该函数运行几乎完美,只是它没有将结果存储在 dataHarvard 中。我读到这在函数中是正常的,使用 <<- 而不是 = 可以解决这个问题,但是由于我正在使用 assign 函数,这实际上是不可能的,因为 = 只是 assign 的结果功能。

这里是一些数据:

sales = c(2, 3, 5,6) 
numberofemployees = c(1, 9, 20,12) 
allcollaborationHarvard = c(0, 1, 0,1) 
originaldata = data.frame(sales, numberofemployees, allcollaborationHarvard)

一般情况下,最好不要将data/a变量嵌入到对象的名称中。因此,不要使用 assigndataHarvard,而是使用名为 "Harvard":

的元素创建列表 data
# enumerate unis, attaching names for lapply to use
unis = setNames(, "Harvard")

# make a table for each subset with lapply
data = lapply(unis, function(x) 
  originaldata[originaldata[[ paste0("allcollaboration", x) ]] == 1, ]
)

这给出了

> data
$Harvard
  sales numberofemployees allcollaborationHarvard
2     3                 9                       1
4     6                12                       1

如此处所示,您可以使用 DF[["column name"]] 来访问列,而不是像 OP 中那样使用 get。另外,请参阅 ?subset:

中的说明

Warning

This is a convenience function intended for use interactively. For programming it is better to use the standard subsetting functions like [, and in particular the non-standard evaluation of argument subset can have unanticipated consequences.

一般来说,如果可能的话,最好不要在列名中嵌入数据。如果 allcollaboration* 列是互斥的,则可以将它们折叠为具有 "Harvard"、"Yale" 等值的单个分类变量。或者,put the data in long form 可能有意义.

有关安排数据的更多指导,我推荐 Hadley Wickham's tidy data paper