使用R语言translateR包调用微软翻译API报externalptr不可取子集错误
报错根因
这个报错和待翻译文本的语言、编码没有任何关系,是translateR包本身的适配缺陷导致的。
该包最后一次稳定更新停留在2018年,内置的微软翻译接口适配的是Azure旧版翻译API的返回规则,当前微软官方在用的3.0版翻译API返回结构和旧版不兼容,包内部的请求逻辑拿到curl返回的响应后,没有做显式的JSON解析步骤,直接拿原生指针对象(也就是报错里提的externalptr类型)去取translations字段,必然会触发"object of type 'externalptr' is not subsettable"的错误,不管传入什么语言的文本都会复现。
可落地解决方法
- 放弃直接调用包内置的
microsoftTranslate封装函数,手动写轻量调用逻辑即可,核心是补上缺失的响应解析步骤,测试可用的最小代码如下:
library(httr) library(jsonlite) # 替换成你自己的API信息 ms_api_key <- "你的微软翻译API密钥" test_content <- "草" # 发送翻译请求 api_resp <- POST( url = "https://api.cognitive.microsofttranslator.com/translate", add_headers( `Ocp-Apim-Subscription-Key` = ms_api_key, `Content-Type` = "application/json" ), query = list( `api-version` = "3.0", from = "zh-Hans", to = "en" ), body = toJSON(list(list(Text = test_content)), auto_unbox = TRUE) ) # 显式解析JSON响应(原封装函数缺失的核心步骤) parsed_result <- fromJSON(content(api_resp, as = "text", encoding = "UTF-8")) # 提取翻译结果 trans_res <- parsed_result$translations$text
- 针对后续数千条多语种批量翻译场景,可以直接在上述代码基础上做分块处理:按照微软API的请求限制,单次请求最多传入100条文本、总字符数不超过10000即可,把待翻译文本按规则分块后批量请求,比单条循环调用效率高很多,也不容易触发API限流。
- 无需浪费时间排查以下方向:API密钥权限、文本编码格式、源语言/目标语言参数传值错误,这些都不是触发这个报错的原因,重装不同版本的
translateR包也解决不了问题,毕竟包本身已经6年以上没有做接口适配更新了。
内容的提问来源于stack exchange,提问作者user18748461
相关产品推荐
相关产品推荐

