我正在尝试减少脚本中的重复代码,为此,我创建了一些辅助函数。
我正在使用的一个函数不带任何参数,而是使用已经加载到全局环境中的数据集来创建一些子集,然后返回这些data.frames。
我在下面创建了一个简单的示例,该示例并不完全符合我的描述,但是会给出其结构的想法。
# Create function
my_func <- function(){
a <- as.data.frame("ID" = c(1, 2, 3, 4, 5, 6),
"TYPE" = c(1, 1, 2, 2, 3, 3),
"CLASS" = c(1, 2, 3, 4, 5, 6))
b <- as.data.frame("ID" = c(1, 2, 3, 4, 5, 6),
"STATUS" = c(1, 1, 2, 2, 3, 3))
return(list(a, b))
}
# Call to the function
list[a, b] <- my_func()
我遇到的问题不在函数内,而是在调用函数并尝试存储结果时。 如果我这样调用函数:
my_func()
它将两个data.frames打印为列表,但是,当尝试为其分配名称时,出现a does not exist
错误。
我以为我只是错误地退还了它们,或试图错误地存储了它们。
谢谢!
更新
作为参考,我尝试使用此语法的原因是由于此帖子:How to assign from a function which returns more than one value?
此外,我希望在1行中捕获收益,而不必单独分配收益。
例如,在这种情况下,将其分配为:
test <- my_func()
a <- test[[1]]; b <- test[[2]]
但是,如果我的清单更长,这将变得非常乏味。
答案 0 :(得分:1)
函数as.data.frame()
将现有对象转换为数据框。函数data.frame()
是创建数据框所需要的。您也不想将列名作为字符串传递。如果您删除引号并将功能更改为data.frame()
,它将起作用!
# Create function
my_func <- function(){
a <- data.frame(ID = c(1, 2, 3, 4, 5, 6),
TYPE = c(1, 1, 2, 2, 3, 3),
CLASS = c(1, 2, 3, 4, 5, 6))
b <- data.frame(ID = c(1, 2, 3, 4, 5, 6),
STATUS = c(1, 1, 2, 2, 3, 3))
return(list(a, b))
}
# Call to the function
test <- my_func()
R函数只能返回一个值,因此我们将a
和b
连接到一个列表中并返回该值。要访问数据框,可以按索引选择它们:
test[[1]] # returns data.frame 'a' (yes, indices in R start with 1)
test[[2]] # returns data.frame 'b'
答案 1 :(得分:0)
这是更长的数据帧列表的解决方案。
my_func <- function(n){
df_list<-list()
for (i in 1:n){
df_list[[i]]<-data.frame('ID'=rep(i,n), 'sqrt'=rep(sqrt(i),n), 'Class'=rep(sample.int(i,1), n))
return(list(my_df=sapply(1:n, function(i)list(df_list[[i]]))))
}
output= my_func(10)$my_df[[1]]
print(output)
如果要将数据帧“放回原处”,则可以使用rbind函数遍历列表以返回一帧。 希望这是您所需要的。让我知道。