【问题标题】:Return subsetted data in R function在 R 函数中返回子集数据
【发布时间】:2015-07-08 14:09:44
【问题描述】:

我正在尝试编写一个简单的函数来汇总一些数据。 我构造了一个带有 4 个参数的函数,以根据某些类别对主表进行子集化。 问题是,当我使用将我的数据子集(统一)的参数运行函数时,我看不到打印的汇总统计信息或子集表。基本上,代码只适用于以下行:return(tabel_masive_global)

这里是代码。谢谢。

> #Functie tabel avansat
fct_tab_av <- function(baza, unitate){
  #Incarcare pachete necesare
  library(plyr)
  library(xlsx)

  #Sumarizarea pe toti peretiii
  print("---------------------------------------------------------------------------------------------")
  print("#Sumarizare pentru toti peretii")
  print(summary(baza))

  #Tabel statistic global pe masive
  print("---------------------------------------------------------------------------------------------")
  print("#Tabel statistic global pe masive")
  tabel_masive_global <- ddply(baza,~Masiv, summarise, Nr_Pereti=length(Masiv),S_tot = sum(Suprafata), S_med=mean(Suprafata), H_med = mean(Inaltimea), Pa_med=mean(Panta), Alt_med=mean(Altitudinea), SD_Suprafata=sd(Suprafata), SD_Inaltimea=sd(Inaltimea), SD_Panta=sd(Panta), SD_Altitudinea=sd(Altitudinea))
  return(tabel_masive_global)

  #Subset pe unitate
  subs_unitate <- subset(baza, Unitate=="unitate")
  return(subs_unitate)
  #Sumarizare pe unitate
  print("---------------------------------------------------------------------------------------------")
  print("#Sumarizare pe unitate")
  print(summary(subs_unitate))

  #Tabel statistic pe unitate in functie de litologie
  print("---------------------------------------------------------------------------------------------")
  print("Tabel statistic pe unitate in functie de litologie")
  tabel_unitate <- ddply(subs_unitate, ~Litologia_N, summarise, Nr_Pereti=length(Masiv), Proc_Pereti=((Nr_Pereti*100)/(nrow(x))), S_tot = sum(Suprafata), S_med=mean(Suprafata), H_med = mean(Inaltimea), Pa_med=mean(Panta), Alt_med=mean(Altitudinea), SD_Suprafata=sd(Suprafata), SD_Inaltimea=sd(Inaltimea), SD_Panta=sd(Panta), SD_Altitudinea=sd(Altitudinea))
  return(tabel_unitate)
  }

【问题讨论】:

  • 一旦你返回,函数结束。在最后做类似 return(a,b,c,d) 的事情。
  • @jeremycg 你应该把它写成答案
  • 一个函数只能返回一个“事物”。如果要返回多个元素,可以将它们放在函数 end 的列表 return(list(a,b,c,d)) 中。

标签: r function subset


【解决方案1】:

return() 结束一个函数 - 任何时候你按下返回,函数都会给你输出,然后退出。对于您的函数,删除所有返回,并放在最后:

return(list(tabel_masive_global, subs_unitate, tabel_unitate))

我也不会在函数内调用library() - 每次调用函数时,都会重新加载库,这会大大减慢速度。

编辑:这里是一个return如何工作的例子,用cmets(#)来解释:

mycoolfunction <- function(x,y,z){
     print(x) #prints out the x value
     cat(y) #another way of printing
     return(list(y,z)) #returns a list of y and z as an object! function is now exited
     print(x) #not done
     print(y) #not done
}

现在让我们看看我们得到了什么:

mycoolfunction(1,2,3)

你应该得到:

[1] 1 
2[[1]]
[1] 2

[[2]]
[1] 3

我们从打印 1 得到 [1] 1,从 cat 2 得到 2 - 我们没有从 cat 得到行指示符 ([1]) 或换行符,以及 y 和 z 的列表. 我们不会重新打印 x 或 y,因为函数已经返回。

现在让我们尝试分配:

x=mycoolfunction(1,2,3)
[1] 1
2

这次我们只打印和 cat。 但是如果我们问 x 是什么,它就是我们的 y 和 z 列表:

x

[[1]]
[1] 2

[[2]]
[1] 3

【讨论】:

  • 仍然不打印子集数据。是否需要在回车行后面写总结?
  • 一旦函数返回,它就完成了,所以把总结放在上面。如果您只想打印到控制台,请将 return 更改为 print,如果您希望能够以其他方式使用它们,return 就是您想要的。
  • 按照您的建议,我使用了 return,但它仍然不打印子集数据帧或子集数据摘要。
猜你喜欢
  • 2018-06-06
  • 1970-01-01
  • 2011-03-25
  • 1970-01-01
  • 2020-07-05
  • 2022-08-24
  • 1970-01-01
  • 2012-11-12
  • 1970-01-01
相关资源
最近更新 更多