R Shiny使用parallel包parLapply时出现非函数对象调用错误求助
attempt to apply an object that is not a function错误的常见原因 并行节点中函数未正确定义或加载:你提到在每个核心定义了
FindElementaryCircuits函数,但可能存在定义时机不对的问题。比如,在创建集群之后才尝试定义函数,或者定义过程中出现语法错误,导致该对象在子节点中不是函数类型。另外,加载DLL的操作可能没在每个子节点成功执行,使得依赖DLL的函数无法正常初始化。变量/函数的作用域问题:在
parLapply中传递的任务可能引用了父环境中的对象,但子节点并没有正确导出这些对象。比如,如果你的并行任务里用到了某个未显式通过clusterExport导出的函数或变量,子节点会尝试寻找但找不到,可能误将其他同名非函数对象当作函数调用。包加载不完整:虽然你说在每个核心安装了必要包,但可能只是安装而非正确加载。比如,仅执行了
install.packages但没在子节点中调用library()加载包,导致包内的函数(比如openxlsx的写入函数)无法被识别,进而在调用时触发非函数对象的错误。任务参数传递错误:如果
parLapply的第二个参数(待处理的列表)中混入了非预期的对象,或者任务函数的参数匹配错误,可能导致代码尝试将一个非函数对象当作函数来调用。比如,误把数据对象当成函数传递给了需要函数参数的位置。集群初始化的顺序问题:在Windows的socket集群中,必须先完成所有子节点的环境配置(加载包、定义函数、导出变量),再提交
parLapply任务。如果顺序颠倒,比如先提交任务再配置子节点,子节点执行任务时环境还未准备好,就会出现函数未定义的情况。
内容的提问来源于stack exchange,提问作者Olivier7121

