R语言moonsun包planets()函数返回data.frame列显示与访问异常问题
解决moonsun包planets()函数显示星座但数据框无对应列的问题
我之前也踩过R包自定义打印方法的类似坑,咱们一步步拆解这个问题:
问题根源
你看到的"Leo"这类星座文本,并不是返回的data.frame的一部分——planets()函数实际只返回ra、d、phase、angle、dist、size、mag这7列。打印时能看到星座,是因为这个包给planets()的返回对象写了自定义print方法:在输出时额外计算并附加了星座信息,但并没有把这部分内容存入返回的data.frame结构里。
你可以用这两行代码验证:
library(moonsun) var <- planets() names(var) # 输出只会显示7个列名,完全找不到星座相关字段 str(var) # 查看数据结构,同样没有星座的痕迹
解决方案:获取并添加星座列
有两种可靠的方式拿到这些星座信息:
方法1:从打印输出中提取
既然打印时能看到星座,我们可以捕获输出内容,再提取出星座部分:
# 捕获planets()的完整打印输出 print_content <- capture.output(planets()) # 跳过第一行的表头,只处理数据行 data_lines <- print_content[-1] # 用字符串处理提取每行最后一个单词(也就是星座) library(stringr) constellations <- str_extract(data_lines, "\\w+$") # 将星座添加到原数据框 var$constellation <- constellations # 现在查看数据框就能看到星座列了 View(var)
方法2:通过赤经赤纬计算星座(更稳定)
星座是根据天体的赤经(ra列)和赤纬(d列)确定的,我们可以用天文相关R包自己计算,比如astrolibR:
# 先安装并加载包 install.packages("astrolibR") library(astrolibR) # 需要把planets()返回的ra、d转换成数值格式(原格式是时分秒/度分秒字符串) # 处理赤经:把"9h 54m 45s"转成小时数 var$ra_hours <- hms2dec(str_replace_all(var$ra, "[hms]", " ")) # 处理赤纬:把"12* 41' 55''"转成度数 var$d_deg <- dms2dec(str_replace_all(var$d, "[*']", " ")) # 用astrolibR的constellation函数计算星座 var$constellation <- constellation(var$ra_hours, var$d_deg)
这种方法不依赖打印输出的格式,就算后续包更新调整了打印样式,也能稳定获取星座信息。
内容的提问来源于stack exchange,提问作者content phd
相关产品推荐
相关产品推荐

