You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 21:23:13