忽略 R 函数中的错误 - try() 函数不起作用



我有一个带有各种UTM源/介质的DataFrame,我想对它进行分割,所以例如,对于UTM_source=123和UTM_mediate=ABC/BCD的行,我想指定名称"123ABC"。我有50多行这样的文字,其中有许多不同来源和媒介的组合,所有其他组合都以"其他"结尾。

问题是,当我想将值分配给一个不存在的组合时,会发生错误并破坏函数。为了使代码正常工作,我必须手动完成所有50多个组合,然后运行其余的代码。

segment_my_DF <- function(DF) {
DF$segment <- NA
# segment based on source and medium  
DF[!is.na(DF$UTMSource__c) & !is.na(DF$UTMMedium__c) & 
DF$UTMSource__c =="123" & DF$UTMMedium__c =="ABC", ]$segment = 
"123ABC"
DF[!is.na(DF$UTMSource__c) & !is.na(DF$UTMMedium__c) & 
DF$UTMSource__c =="123" & DF$UTMMedium__c =="BCD", ]$segment = 
"123ABC"
DF[!is.na(DF$UTMSource__c) & !is.na(DF$UTMMedium__c) & 
DF$UTMSource__c =="234" & DF$UTMMedium__c =="ABC", 
]$segment = "234ABC"
...
# pack all the others
DF[is.na(DF$segment), ]$segment = "OTHERS"
return(DF)
}

假设我的DataFrame没有任何UTM_Source="123"和UTM_Medium="ABC"的行。我收到的错误信息是:

Error in `$<-.data.frame`(`*tmp*`, "segment", value = "B2B") : 
replacement has 1 row, data has 0 

我希望函数能更进一步,就像一个"if"语句。我尝试在函数中使用try()(同时带有()和{}括号):

segment_my_DF <- function(DF) {
DF$segment <- NA
# segment based on source and medium  
try(
...
)
# pack all the others
DF[is.na(DF$segment), ]$segment = "OTHERS"
return(DF)
}

它会使函数立即崩溃。在调用函数时,我尝试使用try()(同时带有()和{}括号):

segmented_Marketing <- try({segment_my_DF(Rest)})

它不起作用。我应该如何处理这个问题?我想到的一件事是将所有50多个条件都封装在50多个"if"语句中,但必须有一种更简单的方法。

我会写一个简单的函数来做这件事

setIfAny <- function(condition, value) {
if (any(condition))
DF[condition, "segment"] <<- value
}

因为我使用了<<-超级赋值运算符,所以赋值发生在函数之外,您可以执行之类的操作

setIfAny(!is.na(DF$UTMSource__c) & !is.na(DF$UTMMedium__c) & 
DF$UTMSource__c =="123" & DF$UTMMedium__c =="ABC", 
"123ABC")

如果您想避免超级分配,可以将DF传递到函数中,并在最后返回:

modifyIfAny <- function(data, condition, value) {
if (any(condition))
data[condition, "segment"] <- value
data
}

你会用它作为

DF <- modifyIfAny(DF, 
!is.na(DF$UTMSource__c) & !is.na(DF$UTMMedium__c) & DF$UTMSource__c =="123" & DF$UTMMedium__c =="ABC", 
"123ABC")

最新更新