code: function _runInDataframe (viz, viewportExpressions, dataframe, processedFeaturesIDs, inViewportFeaturesIDs) {
      for (let i = 0; i < dataframe.numFeatures; i++) {
          const idProperty = viz.metadata.idProperty;
          const featureId = dataframe.properties[idProperty][i];
  
          const featureAlreadyAccumulated = processedFeaturesIDs.has(featureId);
          if (featureAlreadyAccumulated) {
              continue; // This is correct for viewportExpressions related to 'alphanumeric' properties (not geometry-related)
          }
  
          const featureOutsideViewport = !dataframe.inViewport(i);
          if (featureOutsideViewport) {
              continue;
          }
  
          // a new feature, inside the viewport
          processedFeaturesIDs.add(featureId);
          const feature = dataframe.getFeature(i);
  
          const featureIsFilteredOut = viz.filter.eval(feature) < FILTERING_THRESHOLD;
          if (featureIsFilteredOut) {
              continue;
          }
  
          inViewportFeaturesIDs.add(feature[idProperty]); // inViewport & in filter
  
          // not a filtered feature, so pass the rawFeature to viewport expressions
          viewportExpressions.forEach(expr => expr.accumViewportAgg(feature));
      }
  }
docs: Run viewport aggregations in the dataframe. It excludes features:
  - already accumulated in other dataframes
  - outside the viewport
  - filtered out