R语言sets包fuzzy_inference()函数Null属性赋值错误求助
fuzzy_inference()的attr(x, "memberships") <- value空指针错误 你遇到的这个错误Error in attr(x, "memberships") <- value : attempt to set an attribute on NULL,本质是代码在尝试给一个NULL对象添加属性,放在你的模糊推理场景里,大概率是某个模糊变量或规则没有正确初始化,导致fuzzy_inference()接收到了无效的输入。结合你给出的代码片段,我整理了几个关键的排查和解决步骤:
1. 先补全截断的模糊变量定义
你的代码里humidity = fuzzy_partiti...明显没写完,这会直接导致variables对象不完整,甚至变成NULL。你需要像定义rainfall和maxTemp那样,完整定义humidity的模糊分区,比如:
variables <- set( rainfall=fuzzy_partition(varnames = c(range1 = 30, range2 = 70, range3 = 90),sd = 5.0), maxTemp = fuzzy_partition(varnames = c(hot = 30, hotter = 70),sd = 5.0), # 补全humidity的定义示例,你可以根据实际需求调整区间 humidity = fuzzy_partition(varnames = c(dry = 20, moderate = 50, wet = 80), sd = 5.0) )
确保所有变量都没有语法错误、没有截断,每个fuzzy_partition调用都有完整的参数。
2. 检查模糊规则的有效性
fuzzy_inference()依赖正确的模糊规则集合,你需要确保规则的语法正确,且引用的所有模糊集合都存在于对应的变量中。比如正确的规则定义应该是这样的:
# 先定义输出变量的模糊分区(比如气候区) climate <- fuzzy_partition(varnames = c(temperate = 40, tropical = 70, arid = 10), sd = 5.0) # 定义规则 rules <- set( fuzzy_rule(rainfall %is% range1 & maxTemp %is% hot, climate %is% temperate), fuzzy_rule(rainfall %is% range3 & humidity %is% wet, climate %is% tropical), fuzzy_rule(rainfall %is% range1 & humidity %is% dry, climate %is% arid) )
注意规则里的每个%is%引用的集合(比如range1、hot)都要在对应的变量(rainfall、maxTemp)中存在,拼写和大小写要完全一致。
3. 提前验证关键对象的完整性
在调用fuzzy_inference()之前,先手动检查variables和rules是否有效,避免传入NULL:
# 打印variables确认所有变量都已正确创建 print(variables) # 打印rules确认规则没有语法错误 print(rules)
如果输出里有NULL或者缺失的变量/规则,就回到前面的步骤排查问题。
4. 确认fuzzy_inference()的输入参数匹配
调用函数时,要确保输入数据的列名和variables中的变量名完全匹配,比如:
# 示例输入数据,列名要和variables里的变量一致 input_data <- data.frame(rainfall = 45, maxTemp = 28, humidity = 55) # 执行模糊推理 result <- fuzzy_inference(variables, rules, input_data)
如果列名不匹配,函数也可能无法正确识别变量,导致内部出现NULL对象。
总的来说,这个错误的核心原因是某个关键对象(模糊变量、规则)没有被正确初始化,先从补全截断的代码入手,再逐步验证每个部分的正确性,应该就能解决问题了。
内容的提问来源于stack exchange,提问作者Manasa Manjunatha

