【发布时间】:2021-06-09 12:49:45
【问题描述】:
我是 R 编程新手,对这个问题有点困惑。我有 3 个不同的数据库,我想从中提取 2 组测试和训练数据。我知道如何使用单独的代码行来执行此操作,但这是重复性任务,因此我想使用函数自动执行此操作。
我希望我的输出名称带有数据库名称,然后是测试或训练,然后是数字,我想将它们直接导出到全局环境中。这是我编写的代码(使用 MTCARS)作为不工作的示例数据库。我也给出了我想要的输出
需要说明的是,这只是一个示例。在不同的领域,我想在全局环境中自定义 function(x) 的输出,而无需一遍又一遍地编写代码。
mydata<-mtcars
output_2_set_test_train <-function(x){
library(caTools)
i=1
dfname <- deparse(substitute(x))
while(i<=2){
sample.split(x[[1]], SplitRatio = .75)->split_tag
subset(x, split_tag==T)->> paste0(dfname,"_","train","_",i)
subset(x, split_tag==F)->> paste0(dfname,"_","test","_",i)
i=i+1
}
}
output_2_set_test_train(mydata)
运行我的函数后,我希望我的全局环境具有以下具有此特定名称的数据框 -
#1 数据框命名 -> mydata_train_1 #2 数据框命名 -> mydata_test_1 #3 数据框命名 -> mydata_train_2 #4 数据框命名 -> mydata_test_2
我尝试对此进行大量搜索,但找不到任何有效的答案。
有人可以帮我更正代码吗?
【问题讨论】:
-
这基本上是一个非常糟糕的主意,即使它有效。不要将函数内部的东西分配到全局环境中。相反,返回值。其他一些注意事项:在函数中调用
library也是一个坏主意,因为它会导致另一个全局副作用。写foo==TRUE是多余的;只需写foo。foo==FALSE也一样:只写! foo。并且不要使用快捷方式T和F,因为这些是可以被覆盖的变量。最后,您的while循环不必要地令人费解——这应该是一个for循环,或者更好的是,一个lapply调用。 -
还有一个:从左到右的赋值是单调的,应该用从右到左的赋值代替,以使受让人更明显。我建议您忘记
->/->>运算符甚至存在,并且永远不要使用它。它在 R 中的存在确实是一个错误(这是几乎没有其他语言具有等价物的原因)。 -
您好@KonradRudolph,感谢您的反馈。正如我提到的,我对 R 和编程完全陌生。感谢您的反馈。它将帮助我学习和提高,但我一直在尝试自学并且对惯用语/单用语代码一无所知。我会阅读。我使用 -> / ->> 的原因是因为我在 MIT 上 EDX 的基础课程,他们建议在 R 中使用 -> 而不是 =。
标签: r dataframe function customization