封装rStrava包调用Strava API的R函数失效问题求助
解决rStrava封装函数后"Object 'high' not found"报错问题
问题核心
将调用Strava API的rStrava代码封装为函数后,执行时触发Object "high" not found错误,但相同逻辑的独立代码可正常运行。函数预期功能是根据传入的会话ID、分辨率参数,返回指定名称的训练数据集。
报错原因
报错直接原因是调用函数时未给resolution参数加引号:独立代码中直接使用resolution = "high"(字符串格式),R能正确识别;但封装函数后,若调用时传入resolution = high(无引号),R会将high解析为变量名,尝试查找名为high的对象,而该对象不存在,因此抛出错误。
解决方案
方案1:调用函数时传递字符串参数
调用函数时,确保resolution参数用引号包裹,传递字符串值:
generate_strava_session_data(id = 123456, df_name = "my_strava_data", resolution = "high")
方案2:修改函数,兼容无引号参数输入
如果希望函数能自动处理无引号的参数输入,可在函数内部将resolution转为字符串,同时添加参数合法性验证:
generate_strava_session_data <- function(id, df_name, resolution){ # 检查依赖包是否安装 if (!requireNamespace("rStrava", quietly = TRUE)) { stop("请先安装rStrava包:install.packages('rStrava')") } # API配置信息 app_name <- "#" app_client_id <- "#" app_secret <- "#" # 获取Strava认证token strava_token <- httr::config(token = strava_oauth(app_name, app_client_id, app_secret, app_scope = "activity:read_all")) # 处理resolution参数:转为字符串并验证合法性 resolution <- as.character(substitute(resolution)) valid_resolutions <- c("low", "medium", "high") if (!resolution %in% valid_resolutions) { stop(paste("resolution参数无效,可选值:", paste(valid_resolutions, collapse = ", "))) } # 获取活动数据与流信息 my_acts <- get_activity_list(strava_token) result <- get_activity_streams(my_acts, strava_token, id = id, resolution = resolution) # 将结果存入全局环境指定名称 assign(df_name, result, envir = .GlobalEnv) message(paste("数据集", df_name, "已创建")) # 静默返回结果(可选) return(invisible(result)) }
额外优化提示
- 避免在函数内部重复调用
library(),改用requireNamespace()检查包状态,提升运行效率。 - 若不需要将结果存入全局环境,可删除
assign()语句,直接返回result,让用户自行赋值(更符合R函数最佳实践)。
调用示例
两种输入格式均支持:
# 无引号参数 generate_strava_session_data(id = 123456, df_name = "morning_run", resolution = high) # 带引号参数 generate_strava_session_data(id = 123456, df_name = "morning_run", resolution = "high")
内容的提问来源于stack exchange,提问作者Simen Løkken
相关产品推荐
相关产品推荐

