自定义函数不起作用,但逐行起作用
Posted
技术标签:
【中文标题】自定义函数不起作用,但逐行起作用【英文标题】:User-defined function does not function, but line-by-line works 【发布时间】:2020-11-24 16:21:36 【问题描述】:我的目标是定义一个函数,该函数基本上根据另一个表中的可选值的数量复制一行。每个新行将包含唯一可选值的组合。我在一个度量上运行了以下代码,但计划在成功定义一个函数后对多个度量使用循环。但是,该函数没有运行,但我可以将代码分块并且工作正常。提前致谢!
output_template_v2<-output_template_v1
measure <- "A"
col <- "1"
add_selOptions_to_output<-function(output_template_v2, measure, col, attributes)
if (tolower(str_sub(attributes$Attribute,-4, -1)) == "_sel")
selOptions<-attributes[attributes$Measure.Name ==measure & attributes$Attribute == col & attributes$Program == "Blue",]
if (length(selOptions$Attribute > 0))
subcopy<- output_template_v2[output_template_v2$Measure == measure,]
output_template_v2<-output_template_v2[output_template_v2$Measure != measure,]
subcopy<-subcopy[rep(1, length(selOptions$Attribute)),]
for (i in seq_along(selOptions))
subcopy[,col][i]<-selOptions$Attribute[i]
output_template_v2 <-rbind(output_template_v2, subcopy)
【问题讨论】:
你能提供一个样本数据集吗?你可以简单地使用dput(data)
。
【参考方案1】:
函数可以工作——但它不会修改它的函数参数,因为函数参数被复制到函数中。相反,函数返回修改后的表。这已经可以了,但是函数最后一行的赋值是多余的,所以删除它:
add_selOptions_to_output <- function (output_template_v2, measure, col, attributes)
if (tolower(str_sub(attributes$Product.Attribute, -4L, -1L)) == "_sel")
selOptions <- attributes[
attributes$Catalog.Measure.Name == measure &
attributes$Product.Attribute == col &
attributes$Program == "Blue", ]
if (length(selOptions$Attribute.Values > 0))
subcopy <- output_template_v2[output_template_v2$`Measure #` == measure, ]
output_template_v2 <- output_template_v2[output_template_v2$`Measure #` != measure, ]
subcopy <- subcopy[rep(1L, length(selOptions$Attribute.Values)), ]
for (i in seq_along(selOptions))
subcopy[, col][i] <- selOptions$Attribute.Values[i]
rbind(output_template_v2, subcopy)
无论哪种方式,您都需要将函数的返回值分配回您调用它的参数,例如:
tmpl = add_selOptions_to_output(tmpl, measure, col, attributes)
【讨论】:
请注意,我的回答并没有尝试更改函数的实现以使其更具可读性,但我相信可以而且应该这样做。例如,rep
函数调用是奇数;如果我正确理解它的目的,它可以用seq_along(selOptions$Attribute.Values)
代替。并且可以完全删除 for
循环以支持单个分配。
谢谢!我应该补充一点,在我运行该函数后 output_template_v2 不会改变。应该在 output_template_v2 数据帧中添加另一个子副本行,如果我逐行运行它,我可以实现。以上是关于自定义函数不起作用,但逐行起作用的主要内容,如果未能解决你的问题,请参考以下文章
自定义 Keras binary_crossentropy 损失函数不起作用