从R中的data.frame创建新类

从R中的data.frame创建新类,r,R,我在玩弄R中的函数、类和方法。 为了有一个同样有用的“动手”练习,我决定制定我的“一揽子计划”来照顾我的家庭预算。 简单地说,我想要一系列函数、类和方法来计算东西、绘制不同类型的图表等等。 我想做的第一件事是创建一个“Budget”类:它应该接收一个带有特定列的csv,并返回一个对象“Budget”,该对象继承数据帧的相同方法,但我可以对其应用一组“Budgets”方法。 这是我的照片 prepareData = function (csv, type=1) { if (type == 1)

我在玩弄R中的函数、类和方法。 为了有一个同样有用的“动手”练习,我决定制定我的“一揽子计划”来照顾我的家庭预算。 简单地说,我想要一系列函数、类和方法来计算东西、绘制不同类型的图表等等。 我想做的第一件事是创建一个“Budget”类:它应该接收一个带有特定列的csv,并返回一个对象“Budget”,该对象继承数据帧的相同方法,但我可以对其应用一组“Budgets”方法。 这是我的照片

prepareData = function (csv, type=1) {

if (type == 1) {
Data = read.csv(csv,dec = ".")}
else if (type == 2) {
Data = read.csv2(csv,dec = ",")}
else {stop ("Accetable value for type are 1 and 2")}

NamesToHave = c("Date","Title","Amount","Category")

if (sum(as.numeric(colnames(Data) %in% NamesToHave)) < 4) {
    stop ("The csv file has not the mandatory columns (Data, Title, Amount, Category)")}




if (class(try(tolower(Data$Title),silent = T)) == "try-error" | class(try(tolower(Data$Category),silent = T)) == "try-error") {
    stop("Are you sure there are no special character in your csv file ?")} 

Data$Day = sapply(strsplit(as.character(Data$Date), "/"),"[[",1)
Data$Month = month.abb[as.numeric(sapply(strsplit(as.character(Data$Date), "/"),"[[",2))]
Data$Year = sapply(strsplit(as.character(Data$Date), "/"),"[[",3)

Data = Data[with(Data, order(Year, Month, Day)), ]
Data$Amount = as.character(Data$Amount)
Data$Amount = as.numeric(as.character(Data$Amount))

class(Data) <- append(class(Data),"Budget")
return(Data)
}
我跑

Data = prepareData("name.csv")
class(Data)
输出只是“data.frame”。但如果我从终端再次运行函数的第二行到最后一行

class(Data) <- append(class(Data),"Budget")
class(Data)
类(数据)您的问题在这里:

if (as.numeric(colnames(Data) %in% NamesToHave) != 4) {}
第一次比较将被矢量化并返回
TRUE
,当抛出
as.numeric()
时,它将变成
1
。然后,将此向量与
!=4
,执行矢量化并返回
TRUE
(所有的“一”与四个不同)。if()`语句不会对整个向量求值,只会对它的第一个元素求值(并向您抛出一条警告消息)

要解决此问题,只需将
as.numeric()
函数切换为
sum()

当对逻辑向量求和时,
R
将强制它为数值:all
TRUE
变为
1
,all
FASLE
变为
0
。现在,您将在if语句中获得4个求和值,该值将求值
FALSE
,函数将平稳运行。一旦我解决了它,当我第一次运行它时,它有两个类


如中所述,最好在发布问题之前重新启动
R
,并确保您报告的问题仍然存在。

我无法重现您的问题,因为您发布的示例存在多个问题。请看一看。我也无法重现您的问题,对象似乎有两个正确的类。我知道,奇怪的是,当我修复了一个不相关的问题(见下面的答案)后,问题就得到了修复。正如Tomas所说,有时重新启动R可能会有所帮助。谢谢,事实上,我在更正示例时发现了同样的问题。然而,作为一个后续行动和一种提高自己的方法:你认为这是一个最小的可复制的例子缺乏什么?我输入了数据和代码,我还能做得更好吗?无论如何,再次感谢!在函数本身之前,我们不需要知道您处理过的每一个案例(所有这些都是在开始时处理过的)。事实上,如果你在发帖之前把它们取下来,你会意识到问题不在于分配课程,而在于处理可能出现的错误。谢谢你的反馈!
if (as.numeric(colnames(Data) %in% NamesToHave) != 4) {}
if (sum(colnames(Data) %in% NamesToHave) != 4) {}