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

如何在R中用here()与source()设置项目根目录并解决cmdstanr报错

问题说明

我需要在R中使用here::here()与source()函数,结合new.env()创建新环境,设置项目根目录并将数据读取至父环境,该代码将用于Stan与R的cmdstanr包交互。但我对这些函数的用法存疑,且运行代码时出现CSV文件读取报错。

虚拟数据框

tibble(
       Month = sample(month.name, 120, replace = TRUE),
       Year = sample(2012:2024, 120, replace = TRUE),
       Number_Daffodils = sample(1:5, 120, replace = TRUE)
      ) 

原R代码

library(here)

#安装cmdstanr包
install.packages("cmdstanr", repos = c("https://mc-stan.org/r-packages/", getOption("repos")))

knitr::opts_chunk$set(echo = FALSE, message = FALSE, warning = FALSE)

#创建新环境并读取数据
datenv <- new.env()
source(here::here("Users/coreybrown/Documents/Dat_Frame/Data/dat.csv"), local = datenv)
dat <- datenv$dat

报错信息

Error in source(here::here("Users/coreybrown/Documents/Dat_Frame/Data/dat.csv"),  : 
  /Users/coreybrown/Documents/Dat_Frame/Data/dat.csv:1:5: unexpected ','
1: year,

实际数据框示例

year     month Number_Daffodils Frequency_New_Bulbs       date n_month
1  2012   January                1                   7 2012-01-01       1
2  2012  February                8                  59 2012-02-01       2
3  2012     April               18                 144 2012-04-01       4
4  2012       May               21                 193 2012-05-01       5
解决方案

1. 核心错误原因

source()是用来执行R脚本文件(.R后缀)的工具,你用它读取CSV文件时,R会把CSV的文本当成R代码解析,自然会因为逗号、列名这些非R语法报错。

2. 正确的CSV读取方式

要读取CSV文件,得用read.csv()或readr::read_csv()这类专门的文件读取函数,结合here::here()定位路径后,把数据存入新环境:

library(here)
library(readr) # 可选,比base包的read.csv读写速度更快

# cmdstanr仅需安装一次,后续可注释该行
install.packages("cmdstanr", repos = c("https://mc-stan.org/r-packages/", getOption("repos")))

knitr::opts_chunk$set(echo = FALSE, message = FALSE, warning = FALSE)

# 创建新环境并读取数据
datenv <- new.env()
# 用read_csv读取CSV并存入新环境
datenv$dat <- read_csv(here("Data", "dat.csv"))
# 将数据导入父环境
dat <- datenv$dat

3. here::here()的正确用法

here::here()是基于项目根目录(通过.Rproj文件识别)定位文件的,不需要写完整绝对路径。只要你的R项目根目录是/Users/coreybrown/Documents/Dat_Frame/,直接写here("Data", "dat.csv")就能精准定位到目标文件,不用额外写前面的用户目录路径。

4. new.env()的使用建议

你用new.env()隔离数据的思路没问题,能避免污染全局环境。但如果只是为了给cmdstanr传数据,其实可以直接读取到全局环境,或者直接把数据传入cmdstanr的采样函数,不用额外创建环境,除非你有明确的隔离需求:

# 简化版:直接读取数据
dat <- read_csv(here("Data", "dat.csv"))
# 传入cmdstanr运行模型
model <- cmdstan_model("model.stan")
fit <- model$sample(data = dat)

内容的提问来源于stack exchange,提问作者Alice Hobbs

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 18:53:16